Newer
Older
TelosDB / src / backend / mcp-tools.js
import { CONFIG } from "./config.js";
import { Logger } from "./logger.js";

/**
 * MCP ツール定義を取得
 * @returns {Array} ツール定義の配列
 * @description
 * - add_item_text: テキストから埋め込みを自動生成して保存
 * - add_item: テキストと埋め込みベクトルを直接保存
 * - search_text: テキストから埋め込みを自動生成して検索
 * - search_vector: ベクトルで直接検索
 * - llm_generate: llama.cpp でテキスト生成を実行
 */
export function getToolDefinitions() {
  const embeddingDim = CONFIG.database.embeddingDim;

  return [
    {
      name: "add_item_text",
      description: "テキストから埋め込みを生成して保存します",
      inputSchema: {
        type: "object",
        properties: {
          content: {
            type: "string",
            description: "保存するテキスト内容",
          },
          path: {
            type: "string",
            description: "アイテムのメタデータパス(オプション)",
          },
        },
        required: ["content"],
      },
    },
    {
      name: "add_item",
      description: "テキストと埋め込みベクトルを直接保存します",
      inputSchema: {
        type: "object",
        properties: {
          content: {
            type: "string",
            description: "保存するテキスト内容",
          },
          path: {
            type: "string",
            description: "アイテムのメタデータパス(オプション)",
          },
          vector: {
            type: "array",
            items: { type: "number" },
            minItems: embeddingDim,
            maxItems: embeddingDim,
            description: `埋め込みベクトル (${embeddingDim}次元)`,
          },
        },
        required: ["content", "vector"],
      },
    },
    {
      name: "search_text",
      description: "テキストから埋め込みを生成して類似アイテムを検索します",
      inputSchema: {
        type: "object",
        properties: {
          content: {
            type: "string",
            description: "検索キーワード",
          },
          limit: {
            type: "number",
            description: "返す結果の最大数(デフォルト: 10)",
            minimum: 1,
            maximum: 100,
          },
        },
        required: ["content"],
      },
    },
    {
      name: "search_vector",
      description: "ベクトルで類似度検索を実行します",
      inputSchema: {
        type: "object",
        properties: {
          vector: {
            type: "array",
            items: { type: "number" },
            minItems: embeddingDim,
            maxItems: embeddingDim,
            description: `検索するベクトル (${embeddingDim}次元)`,
          },
          limit: {
            type: "number",
            description: "返す結果の最大数(デフォルト: 10)",
            minimum: 1,
            maximum: 100,
          },
        },
        required: ["vector"],
      },
    },
    {
      name: "llm_generate",
      description: "llama.cpp でテキスト生成を実行します",
      inputSchema: {
        type: "object",
        properties: {
          prompt: {
            type: "string",
            description: "生成するテキストのプロンプト",
          },
          n_predict: {
            type: "number",
            description: "生成するトークン数(デフォルト: 128)",
            minimum: 1,
            maximum: 2048,
          },
          temperature: {
            type: "number",
            description: "温度パラメータ(0.0-2.0、デフォルト: 0.7)",
            minimum: 0,
            maximum: 2,
          },
        },
        required: ["prompt"],
      },
    },
  ];
}

/**
 * ツール名の定数
 */
export const TOOL_NAMES = {
  ADD_ITEM_TEXT: "add_item_text",
  ADD_ITEM: "add_item",
  SEARCH_TEXT: "search_text",
  SEARCH_VECTOR: "search_vector",
  LLM_GENERATE: "llm_generate",
};

Logger.debug("MCP tools module loaded");