@kansei-link/mcp-server 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/db/schema.js CHANGED
@@ -42,9 +42,21 @@ export function initializeDb(db) {
42
42
  last_updated TEXT DEFAULT (datetime('now'))
43
43
  );
44
44
 
45
+ CREATE TABLE IF NOT EXISTS service_changelog (
46
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
47
+ service_id TEXT NOT NULL REFERENCES services(id),
48
+ change_date TEXT NOT NULL,
49
+ change_type TEXT NOT NULL,
50
+ summary TEXT NOT NULL,
51
+ details TEXT,
52
+ created_at TEXT DEFAULT (datetime('now'))
53
+ );
54
+
45
55
  CREATE INDEX IF NOT EXISTS idx_outcomes_service ON outcomes(service_id);
46
56
  CREATE INDEX IF NOT EXISTS idx_outcomes_created ON outcomes(created_at);
47
57
  CREATE INDEX IF NOT EXISTS idx_services_category ON services(category);
58
+ CREATE INDEX IF NOT EXISTS idx_changelog_service ON service_changelog(service_id);
59
+ CREATE INDEX IF NOT EXISTS idx_changelog_date ON service_changelog(change_date);
48
60
  `);
49
61
  // FTS5 virtual table for full-text search on services
50
62
  // Check if it already exists first (CREATE VIRTUAL TABLE IF NOT EXISTS not supported in all SQLite builds)
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/db/schema.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,YAAY,CAAC,EAAqB;IAChD,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CP,CAAC,CAAC;IAEH,sDAAsD;IACtD,2GAA2G;IAC3G,MAAM,SAAS,GAAG,EAAE;SACjB,OAAO,CACN,2EAA2E,CAC5E;SACA,GAAG,EAAE,CAAC;IAET,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,EAAE,CAAC,IAAI,CAAC;;;;;KAKP,CAAC,CAAC;QAEH,+BAA+B;QAC/B,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;KAiBP,CAAC,CAAC;IACL,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/db/schema.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,YAAY,CAAC,EAAqB;IAChD,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0DP,CAAC,CAAC;IAEH,sDAAsD;IACtD,2GAA2G;IAC3G,MAAM,SAAS,GAAG,EAAE;SACjB,OAAO,CACN,2EAA2E,CAC5E;SACA,GAAG,EAAE,CAAC;IAET,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,EAAE,CAAC,IAAI,CAAC;;;;;KAKP,CAAC,CAAC;QAEH,+BAA+B;QAC/B,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;KAiBP,CAAC,CAAC;IACL,CAAC;AACH,CAAC"}
package/dist/db/seed.js CHANGED
@@ -14,6 +14,48 @@ function loadJson(filename) {
14
14
  export function seedDatabase(db) {
15
15
  const services = loadJson("services-seed.json");
16
16
  const recipes = loadJson("recipes-seed.json");
17
+ const changelogEntries = [
18
+ // freee
19
+ { service_id: "freee", change_date: "2026-03-27", change_type: "feature", summary: "Remote MCP server version added", details: "freee now offers a hosted MCP endpoint in addition to the local npx runner, reducing setup friction for cloud-native agents." },
20
+ { service_id: "freee", change_date: "2026-03-15", change_type: "feature", summary: "Invoice API v2 endpoint supported", details: "Added support for the new freee Invoice API v2 with line-item tax rounding options and PDF attachment." },
21
+ { service_id: "freee", change_date: "2026-02-28", change_type: "fix", summary: "Bank sync retry logic improved", details: "Fixed intermittent 429 errors during bank account synchronization by adding exponential back-off." },
22
+ // smarthr
23
+ { service_id: "smarthr", change_date: "2026-03-20", change_type: "feature", summary: "Employee bulk import tool added", details: "New bulk_import_employees tool accepts CSV payload and creates multiple employee records in a single call." },
24
+ { service_id: "smarthr", change_date: "2026-03-05", change_type: "fix", summary: "Social insurance PDF generation fix", details: "Resolved issue where generated social insurance documents had incorrect fiscal year headers." },
25
+ { service_id: "smarthr", change_date: "2026-02-18", change_type: "deprecation", summary: "Legacy employee list endpoint deprecated", details: "The v1 list_employees endpoint will be removed on 2026-06-01. Use list_employees_v2 instead." },
26
+ // chatwork
27
+ { service_id: "chatwork", change_date: "2026-03-10", change_type: "feature", summary: "Thread reply support added", details: "Agents can now reply to specific messages in a thread using the new reply_to_message tool." },
28
+ { service_id: "chatwork", change_date: "2026-02-20", change_type: "feature", summary: "File upload size limit increased to 50 MB" },
29
+ { service_id: "chatwork", change_date: "2026-02-05", change_type: "fix", summary: "Room member list pagination corrected" },
30
+ // sansan
31
+ { service_id: "sansan", change_date: "2026-03-22", change_type: "feature", summary: "Business card OCR accuracy improved to 98%", details: "Upgraded OCR model for Japanese vertical text and double-byte characters." },
32
+ { service_id: "sansan", change_date: "2026-03-01", change_type: "breaking", summary: "Authentication switched to OAuth 2.0", details: "API key auth removed. All agents must use OAuth 2.0 client credentials flow. See migration guide." },
33
+ // moneyforward
34
+ { service_id: "moneyforward", change_date: "2026-03-18", change_type: "feature", summary: "AI expense categorization tool added", details: "New auto_categorize_expenses tool uses ML to classify transactions into accounts." },
35
+ { service_id: "moneyforward", change_date: "2026-03-02", change_type: "fix", summary: "Payroll calculation rounding error fixed" },
36
+ { service_id: "moneyforward", change_date: "2026-02-10", change_type: "feature", summary: "Multi-currency journal entry support" },
37
+ // backlog
38
+ { service_id: "backlog", change_date: "2026-03-25", change_type: "feature", summary: "Bulk issue update tool added", details: "Update status, assignee, or priority for multiple issues in a single API call." },
39
+ { service_id: "backlog", change_date: "2026-03-08", change_type: "fix", summary: "Wiki markdown rendering fix for tables" },
40
+ // lineworks
41
+ { service_id: "lineworks", change_date: "2026-03-12", change_type: "feature", summary: "Calendar event creation tool added", details: "Agents can now create, update, and delete LINE WORKS calendar events." },
42
+ { service_id: "lineworks", change_date: "2026-02-25", change_type: "breaking", summary: "Bot API v1 removed", details: "Bot API v1 endpoints no longer respond. Migrate to Bot API v2." },
43
+ // kingoftime
44
+ { service_id: "kingoftime", change_date: "2026-03-15", change_type: "feature", summary: "Overtime alert notification tool added" },
45
+ { service_id: "kingoftime", change_date: "2026-02-28", change_type: "fix", summary: "Shift swap approval workflow fix", details: "Fixed edge case where overlapping shift swaps could both be approved." },
46
+ // base-ec
47
+ { service_id: "base-ec", change_date: "2026-03-20", change_type: "feature", summary: "Inventory webhook support added" },
48
+ { service_id: "base-ec", change_date: "2026-03-05", change_type: "fix", summary: "Order status filter returning stale data fixed" },
49
+ // stores-jp
50
+ { service_id: "stores-jp", change_date: "2026-03-18", change_type: "feature", summary: "POS transaction sync tool added" },
51
+ { service_id: "stores-jp", change_date: "2026-02-22", change_type: "feature", summary: "Reservation slot management tool added" },
52
+ // hubspot-jp
53
+ { service_id: "hubspot-jp", change_date: "2026-03-28", change_type: "feature", summary: "Deal pipeline stage automation tool added" },
54
+ { service_id: "hubspot-jp", change_date: "2026-03-10", change_type: "fix", summary: "Contact merge duplicate detection improved" },
55
+ // jooto
56
+ { service_id: "jooto", change_date: "2026-03-14", change_type: "feature", summary: "Board template cloning tool added" },
57
+ { service_id: "jooto", change_date: "2026-02-15", change_type: "fix", summary: "Label color sync issue resolved" },
58
+ ];
17
59
  const insertService = db.prepare(`
18
60
  INSERT OR IGNORE INTO services (id, name, namespace, description, category, tags, mcp_endpoint, trust_score)
19
61
  VALUES (@id, @name, @namespace, @description, @category, @tags, @mcp_endpoint, @trust_score)
@@ -24,6 +66,10 @@ export function seedDatabase(db) {
24
66
  const insertRecipe = db.prepare(`
25
67
  INSERT OR IGNORE INTO recipes (id, goal, description, steps, required_services)
26
68
  VALUES (@id, @goal, @description, @steps, @required_services)
69
+ `);
70
+ const insertChangelog = db.prepare(`
71
+ INSERT OR IGNORE INTO service_changelog (service_id, change_date, change_type, summary, details)
72
+ VALUES (@service_id, @change_date, @change_type, @summary, @details)
27
73
  `);
28
74
  const seedAll = db.transaction(() => {
29
75
  for (const service of services) {
@@ -37,6 +83,15 @@ export function seedDatabase(db) {
37
83
  required_services: JSON.stringify(recipe.required_services),
38
84
  });
39
85
  }
86
+ for (const entry of changelogEntries) {
87
+ insertChangelog.run({
88
+ service_id: entry.service_id,
89
+ change_date: entry.change_date,
90
+ change_type: entry.change_type,
91
+ summary: entry.summary,
92
+ details: entry.details ?? null,
93
+ });
94
+ }
40
95
  });
41
96
  seedAll();
42
97
  // Rebuild FTS index
@@ -1 +1 @@
1
- {"version":3,"file":"seed.js","sourceRoot":"","sources":["../../src/db/seed.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAqB/D,SAAS,QAAQ,CAAI,QAAgB;IACnC,uDAAuD;IACvD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC1E,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC9D,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC1D,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,EAA4B;IACvD,MAAM,QAAQ,GAAG,QAAQ,CAAgB,oBAAoB,CAAC,CAAC;IAC/D,MAAM,OAAO,GAAG,QAAQ,CAAe,mBAAmB,CAAC,CAAC;IAE5D,MAAM,aAAa,GAAG,EAAE,CAAC,OAAO,CAAC;;;GAGhC,CAAC,CAAC;IAEH,MAAM,WAAW,GAAG,EAAE,CAAC,OAAO,CAAC;;GAE9B,CAAC,CAAC;IAEH,MAAM,YAAY,GAAG,EAAE,CAAC,OAAO,CAAC;;;GAG/B,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;QAClC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC3B,WAAW,CAAC,GAAG,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;QAC9C,CAAC;QAED,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,YAAY,CAAC,GAAG,CAAC;gBACf,GAAG,MAAM;gBACT,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC;gBACnC,iBAAiB,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,iBAAiB,CAAC;aAC5D,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,EAAE,CAAC;IAEV,oBAAoB;IACpB,EAAE,CAAC,IAAI,CAAC,2DAA2D,CAAC,CAAC;IAErE,MAAM,YAAY,GAAG,EAAE;SACpB,OAAO,CAAC,wCAAwC,CAAC;SACjD,GAAG,EAAuB,CAAC;IAC9B,MAAM,WAAW,GAAG,EAAE;SACnB,OAAO,CAAC,uCAAuC,CAAC;SAChD,GAAG,EAAuB,CAAC;IAE9B,OAAO,CAAC,GAAG,CACT,UAAU,YAAY,CAAC,KAAK,iBAAiB,WAAW,CAAC,KAAK,WAAW,CAC1E,CAAC;AACJ,CAAC;AAED,eAAe;AACf,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;AACnB,YAAY,CAAC,EAAE,CAAC,CAAC;AACjB,YAAY,CAAC,EAAE,CAAC,CAAC;AACjB,EAAE,CAAC,KAAK,EAAE,CAAC"}
1
+ {"version":3,"file":"seed.js","sourceRoot":"","sources":["../../src/db/seed.ts"],"names":[],"mappings":"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"}
package/dist/server.js CHANGED
@@ -5,6 +5,8 @@ import { register as registerSearchServices } from "./tools/search-services.js";
5
5
  import { register as registerGetRecipe } from "./tools/get-recipe.js";
6
6
  import { register as registerReportOutcome } from "./tools/report-outcome.js";
7
7
  import { register as registerGetInsights } from "./tools/get-insights.js";
8
+ import { register as registerFindCombinations } from "./tools/find-combinations.js";
9
+ import { register as registerCheckUpdates } from "./tools/check-updates.js";
8
10
  export function createServer() {
9
11
  const server = new McpServer({
10
12
  name: "kansei-link",
@@ -18,6 +20,8 @@ export function createServer() {
18
20
  registerGetRecipe(server, db);
19
21
  registerReportOutcome(server, db);
20
22
  registerGetInsights(server, db);
23
+ registerFindCombinations(server, db);
24
+ registerCheckUpdates(server, db);
21
25
  return server;
22
26
  }
23
27
  //# sourceMappingURL=server.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,QAAQ,IAAI,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAChF,OAAO,EAAE,QAAQ,IAAI,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AACtE,OAAO,EAAE,QAAQ,IAAI,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAC9E,OAAO,EAAE,QAAQ,IAAI,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAE1E,MAAM,UAAU,YAAY;IAC1B,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,aAAa;QACnB,OAAO,EAAE,OAAO;KACjB,CAAC,CAAC;IAEH,sBAAsB;IACtB,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;IACnB,YAAY,CAAC,EAAE,CAAC,CAAC;IAEjB,qBAAqB;IACrB,sBAAsB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACnC,iBAAiB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC9B,qBAAqB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAClC,mBAAmB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAEhC,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,QAAQ,IAAI,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAChF,OAAO,EAAE,QAAQ,IAAI,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AACtE,OAAO,EAAE,QAAQ,IAAI,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAC9E,OAAO,EAAE,QAAQ,IAAI,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC1E,OAAO,EAAE,QAAQ,IAAI,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AACpF,OAAO,EAAE,QAAQ,IAAI,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAE5E,MAAM,UAAU,YAAY;IAC1B,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,aAAa;QACnB,OAAO,EAAE,OAAO;KACjB,CAAC,CAAC;IAEH,sBAAsB;IACtB,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;IACnB,YAAY,CAAC,EAAE,CAAC,CAAC;IAEjB,qBAAqB;IACrB,sBAAsB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACnC,iBAAiB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC9B,qBAAqB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAClC,mBAAmB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAChC,wBAAwB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACrC,oBAAoB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAEjC,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type Database from "better-sqlite3";
3
+ export declare function register(server: McpServer, db: Database.Database): void;
@@ -0,0 +1,81 @@
1
+ import { z } from "zod";
2
+ export function register(server, db) {
3
+ server.registerTool("check_updates", {
4
+ title: "Check Updates",
5
+ description: "Check if an MCP service has changed recently. Returns changelog information including new features, breaking changes, fixes, and deprecations.",
6
+ inputSchema: z.object({
7
+ service: z
8
+ .string()
9
+ .describe("Service name or ID to look up (e.g., 'freee', 'smarthr', 'chatwork')"),
10
+ since_days: z
11
+ .number()
12
+ .optional()
13
+ .default(30)
14
+ .describe("How many days back to look for changes (default: 30)"),
15
+ }),
16
+ annotations: {
17
+ readOnlyHint: true,
18
+ openWorldHint: false,
19
+ },
20
+ }, async ({ service, since_days }) => {
21
+ const result = checkUpdates(db, service, since_days ?? 30);
22
+ return {
23
+ content: [
24
+ {
25
+ type: "text",
26
+ text: JSON.stringify(result, null, 2),
27
+ },
28
+ ],
29
+ };
30
+ });
31
+ }
32
+ function checkUpdates(db, service, sinceDays) {
33
+ // Fuzzy-match service by name or ID
34
+ const pattern = `%${service}%`;
35
+ const matchedService = db
36
+ .prepare(`SELECT id, name, namespace, description, category, mcp_endpoint, trust_score
37
+ FROM services
38
+ WHERE id LIKE ? OR name LIKE ?
39
+ LIMIT 1`)
40
+ .get(pattern, pattern);
41
+ if (!matchedService) {
42
+ return {
43
+ error: "service_not_found",
44
+ message: `No service matching '${service}' was found.`,
45
+ suggestion: "Use search_services to find available services, then retry with the exact service ID.",
46
+ };
47
+ }
48
+ // Calculate the cutoff date
49
+ const cutoffDate = new Date();
50
+ cutoffDate.setDate(cutoffDate.getDate() - sinceDays);
51
+ const cutoffIso = cutoffDate.toISOString().split("T")[0]; // YYYY-MM-DD
52
+ const changes = db
53
+ .prepare(`SELECT id, service_id, change_date, change_type, summary, details
54
+ FROM service_changelog
55
+ WHERE service_id = ? AND change_date >= ?
56
+ ORDER BY change_date DESC`)
57
+ .all(matchedService.id, cutoffIso);
58
+ const hasBreakingChanges = changes.some((c) => c.change_type === "breaking");
59
+ return {
60
+ service: {
61
+ id: matchedService.id,
62
+ name: matchedService.name,
63
+ namespace: matchedService.namespace,
64
+ category: matchedService.category,
65
+ mcp_endpoint: matchedService.mcp_endpoint,
66
+ },
67
+ period: {
68
+ since_days: sinceDays,
69
+ cutoff_date: cutoffIso,
70
+ },
71
+ has_breaking_changes: hasBreakingChanges,
72
+ total_changes: changes.length,
73
+ changes: changes.map((c) => ({
74
+ date: c.change_date,
75
+ type: c.change_type,
76
+ summary: c.summary,
77
+ ...(c.details ? { details: c.details } : {}),
78
+ })),
79
+ };
80
+ }
81
+ //# sourceMappingURL=check-updates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-updates.js","sourceRoot":"","sources":["../../src/tools/check-updates.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type Database from "better-sqlite3";
3
+ export declare function register(server: McpServer, db: Database.Database): void;
4
+ export declare function findCombinations(db: Database.Database, service: string): object[];
@@ -0,0 +1,105 @@
1
+ import { z } from "zod";
2
+ export function register(server, db) {
3
+ server.registerTool("find_combinations", {
4
+ title: "Find Combinations",
5
+ description: "Reverse recipe lookup — given a service or MCP name, find all recipes that include it and show what other services it can be combined with.",
6
+ inputSchema: z.object({
7
+ service: z
8
+ .string()
9
+ .describe("The service name or ID to look up (e.g., 'freee', 'freee-mcp', 'chatwork')"),
10
+ }),
11
+ annotations: {
12
+ readOnlyHint: true,
13
+ openWorldHint: false,
14
+ },
15
+ }, async ({ service }) => {
16
+ const results = findCombinations(db, service);
17
+ return {
18
+ content: [
19
+ {
20
+ type: "text",
21
+ text: JSON.stringify(results, null, 2),
22
+ },
23
+ ],
24
+ };
25
+ });
26
+ }
27
+ export function findCombinations(db, service) {
28
+ const pattern = `%${service}%`;
29
+ // Find all recipes where the service appears in steps or required_services
30
+ const recipes = db
31
+ .prepare(`SELECT * FROM recipes
32
+ WHERE steps LIKE ? OR required_services LIKE ?`)
33
+ .all(pattern, pattern);
34
+ if (recipes.length === 0) {
35
+ return [];
36
+ }
37
+ // Also try to resolve the service against the services table for richer matching
38
+ const matchedServices = db
39
+ .prepare(`SELECT id, name, namespace FROM services
40
+ WHERE id LIKE ? OR name LIKE ?`)
41
+ .all(pattern, pattern);
42
+ const matchedIds = new Set(matchedServices.map((s) => s.id));
43
+ // Cache for service lookups
44
+ const serviceCache = new Map();
45
+ const getService = (id) => {
46
+ if (serviceCache.has(id))
47
+ return serviceCache.get(id);
48
+ const svc = db
49
+ .prepare("SELECT id, name, namespace FROM services WHERE id = ?")
50
+ .get(id);
51
+ if (svc)
52
+ serviceCache.set(id, svc);
53
+ return svc ?? null;
54
+ };
55
+ // Pre-populate cache with matched services
56
+ for (const svc of matchedServices) {
57
+ serviceCache.set(svc.id, svc);
58
+ }
59
+ const results = [];
60
+ for (const recipe of recipes) {
61
+ const steps = JSON.parse(recipe.steps);
62
+ const requiredServices = JSON.parse(recipe.required_services);
63
+ // Find which steps involve the queried service (by ID match or text match)
64
+ const matchingSteps = steps.filter((step) => {
65
+ if (matchedIds.has(step.service_id))
66
+ return true;
67
+ if (step.service_id.toLowerCase().includes(service.toLowerCase()))
68
+ return true;
69
+ return false;
70
+ });
71
+ // If no steps match, skip (the LIKE matched on something unrelated)
72
+ if (matchingSteps.length === 0)
73
+ continue;
74
+ // Build the role description for the matched service
75
+ const roles = matchingSteps.map((step) => ({
76
+ step_order: step.order,
77
+ action: step.action,
78
+ service_id: step.service_id,
79
+ service_name: getService(step.service_id)?.name ?? step.service_id,
80
+ }));
81
+ // Find the other services in this recipe (the combinations)
82
+ const matchingServiceIds = new Set(matchingSteps.map((s) => s.service_id));
83
+ const otherServices = requiredServices
84
+ .filter((id) => !matchingServiceIds.has(id))
85
+ .map((id) => {
86
+ const svc = getService(id);
87
+ return {
88
+ id,
89
+ name: svc?.name ?? id,
90
+ namespace: svc?.namespace ?? null,
91
+ };
92
+ });
93
+ results.push({
94
+ recipe_id: recipe.id,
95
+ recipe_name: recipe.goal,
96
+ description: recipe.description,
97
+ role_in_recipe: roles,
98
+ combines_with: otherServices,
99
+ total_services_needed: requiredServices.length,
100
+ coverage_hint: `You have 1 of ${requiredServices.length} services needed`,
101
+ });
102
+ }
103
+ return results;
104
+ }
105
+ //# sourceMappingURL=find-combinations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find-combinations.js","sourceRoot":"","sources":["../../src/tools/find-combinations.ts"],"names":[],"mappings":"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"}
@@ -33,16 +33,125 @@ export function register(server, db) {
33
33
  };
34
34
  });
35
35
  }
36
+ // ---------------------------------------------------------------------------
37
+ // Intent-to-category mapping layer
38
+ // Maps keyword signals found in a user intent to the most likely service
39
+ // categories. When a service's category matches the detected intent category,
40
+ // it receives a relevance boost so that, e.g., "send invoice" ranks freee
41
+ // (accounting) above Chatwork (communication) even though "send" matches both.
42
+ // ---------------------------------------------------------------------------
43
+ const INTENT_CATEGORY_MAP = {
44
+ // Accounting / finance
45
+ invoice: ["accounting"],
46
+ invoicing: ["accounting"],
47
+ billing: ["accounting"],
48
+ receipt: ["accounting"],
49
+ expense: ["accounting"],
50
+ expenses: ["accounting"],
51
+ tax: ["accounting"],
52
+ taxes: ["accounting"],
53
+ bookkeeping: ["accounting"],
54
+ accounting: ["accounting"],
55
+ payment: ["accounting"],
56
+ payments: ["accounting"],
57
+ payroll: ["accounting", "hr"],
58
+ salary: ["accounting", "hr"],
59
+ ledger: ["accounting"],
60
+ journal: ["accounting"],
61
+ revenue: ["accounting"],
62
+ profit: ["accounting"],
63
+ refund: ["accounting"],
64
+ reimbursement: ["accounting"],
65
+ // HR
66
+ employee: ["hr"],
67
+ employees: ["hr"],
68
+ attendance: ["hr"],
69
+ leave: ["hr"],
70
+ hiring: ["hr"],
71
+ recruit: ["hr"],
72
+ recruitment: ["hr"],
73
+ onboarding: ["hr"],
74
+ talent: ["hr"],
75
+ hr: ["hr"],
76
+ workforce: ["hr"],
77
+ shift: ["hr"],
78
+ timecard: ["hr"],
79
+ // Communication / messaging
80
+ message: ["communication"],
81
+ messages: ["communication"],
82
+ chat: ["communication"],
83
+ messaging: ["communication"],
84
+ notify: ["communication"],
85
+ notification: ["communication"],
86
+ call: ["communication"],
87
+ meeting: ["communication"],
88
+ video: ["communication"],
89
+ // CRM
90
+ lead: ["crm"],
91
+ leads: ["crm"],
92
+ customer: ["crm"],
93
+ customers: ["crm"],
94
+ deal: ["crm"],
95
+ deals: ["crm"],
96
+ pipeline: ["crm"],
97
+ contact: ["crm"],
98
+ contacts: ["crm"],
99
+ prospect: ["crm"],
100
+ sales: ["crm"],
101
+ crm: ["crm"],
102
+ // Project management
103
+ task: ["project_management"],
104
+ tasks: ["project_management"],
105
+ project: ["project_management"],
106
+ projects: ["project_management"],
107
+ sprint: ["project_management"],
108
+ board: ["project_management"],
109
+ kanban: ["project_management"],
110
+ ticket: ["project_management"],
111
+ backlog: ["project_management"],
112
+ milestone: ["project_management"],
113
+ // E-commerce
114
+ product: ["ecommerce"],
115
+ products: ["ecommerce"],
116
+ order: ["ecommerce"],
117
+ orders: ["ecommerce"],
118
+ shipping: ["ecommerce"],
119
+ inventory: ["ecommerce"],
120
+ cart: ["ecommerce"],
121
+ store: ["ecommerce"],
122
+ shop: ["ecommerce"],
123
+ catalog: ["ecommerce"],
124
+ };
125
+ /** Category boost added to relevance_score when service category matches intent */
126
+ const CATEGORY_BOOST = 0.3;
127
+ /**
128
+ * Detect likely categories from an intent string by scanning for keyword
129
+ * signals. Returns a Set of category names (may be empty).
130
+ */
131
+ function detectIntentCategories(intent) {
132
+ const categories = new Set();
133
+ const lower = intent.toLowerCase();
134
+ const tokens = lower.split(/\s+/);
135
+ for (const token of tokens) {
136
+ const mapped = INTENT_CATEGORY_MAP[token];
137
+ if (mapped) {
138
+ for (const cat of mapped)
139
+ categories.add(cat);
140
+ }
141
+ }
142
+ return categories;
143
+ }
36
144
  export function searchServices(db, intent, category, limit = 5) {
145
+ const intentCategories = detectIntentCategories(intent);
37
146
  // Try FTS5 search first
38
- let results = ftsSearch(db, intent, category, limit);
147
+ let results = ftsSearch(db, intent, category, limit, intentCategories);
39
148
  // Fallback to LIKE search if FTS returns nothing
40
149
  if (results.length === 0) {
41
- results = likeSearch(db, intent, category, limit);
150
+ results = likeSearch(db, intent, category, limit, intentCategories);
42
151
  }
43
152
  return results;
44
153
  }
45
- function ftsSearch(db, intent, category, limit) {
154
+ function ftsSearch(db, intent, category, limit, intentCategories) {
46
155
  // Tokenize intent for FTS query (simple word splitting)
47
156
  const tokens = intent
48
157
  .split(/\s+/)
@@ -52,6 +161,8 @@ function ftsSearch(db, intent, category, limit) {
52
161
  if (!tokens)
53
162
  return [];
54
163
  try {
164
+ // Fetch more than `limit` so we can re-rank with category boost before trimming
165
+ const fetchLimit = Math.max(limit * 3, 15);
55
166
  // Join FTS results back to services table via rowid
56
167
  let query = `
57
168
  SELECT s.*, ss.total_calls, ss.success_rate, fts.rank as fts_rank
@@ -66,32 +177,43 @@ function ftsSearch(db, intent, category, limit) {
66
177
  params.push(category);
67
178
  }
68
179
  query += ` ORDER BY fts.rank LIMIT ?`;
69
- params.push(limit);
180
+ params.push(fetchLimit);
70
181
  const services = db.prepare(query).all(...params);
71
182
  if (services.length === 0)
72
183
  return [];
73
- return services.map((s) => ({
74
- service_id: s.id,
75
- name: s.name,
76
- namespace: s.namespace,
77
- description: s.description,
78
- category: s.category,
79
- mcp_endpoint: s.mcp_endpoint,
80
- trust_score: s.trust_score,
81
- usage_count: s.total_calls ?? 0,
82
- success_rate: s.success_rate ?? null,
83
- relevance_score: Math.round((1 / (1 + Math.abs(s.fts_rank)) + s.trust_score * 0.3) * 100) / 100,
84
- }));
184
+ // Compute relevance with category boost, then sort descending
185
+ const scored = services.map((s) => {
186
+ const baseScore = 1 / (1 + Math.abs(s.fts_rank)) + s.trust_score * 0.3;
187
+ const categoryBoost = intentCategories.size > 0 && s.category && intentCategories.has(s.category)
188
+ ? CATEGORY_BOOST
189
+ : 0;
190
+ return {
191
+ service_id: s.id,
192
+ name: s.name,
193
+ namespace: s.namespace,
194
+ description: s.description,
195
+ category: s.category,
196
+ mcp_endpoint: s.mcp_endpoint,
197
+ trust_score: s.trust_score,
198
+ usage_count: s.total_calls ?? 0,
199
+ success_rate: s.success_rate ?? null,
200
+ relevance_score: Math.round((baseScore + categoryBoost) * 100) / 100,
201
+ };
202
+ });
203
+ scored.sort((a, b) => b.relevance_score - a.relevance_score);
204
+ return scored.slice(0, limit);
85
205
  }
86
206
  catch {
87
207
  // FTS query may fail on certain inputs, fall through to LIKE
88
208
  return [];
89
209
  }
90
210
  }
91
- function likeSearch(db, intent, category, limit) {
211
+ function likeSearch(db, intent, category, limit, intentCategories) {
92
212
  const words = intent.split(/\s+/).filter((t) => t.length > 1);
93
213
  if (words.length === 0)
94
214
  return [];
215
+ // Fetch more rows so we can re-rank after category boost
216
+ const fetchLimit = Math.max(limit * 3, 15);
95
217
  const conditions = words.map(() => `(s.name LIKE ? OR s.description LIKE ? OR s.tags LIKE ?)`);
96
218
  const params = [];
97
219
  for (const word of words) {
@@ -109,19 +231,26 @@ function likeSearch(db, intent, category, limit) {
109
231
  params.push(category);
110
232
  }
111
233
  query += ` ORDER BY s.trust_score DESC LIMIT ?`;
112
- params.push(limit);
234
+ params.push(fetchLimit);
113
235
  const services = db.prepare(query).all(...params);
114
- return services.map((s) => ({
115
- service_id: s.id,
116
- name: s.name,
117
- namespace: s.namespace,
118
- description: s.description,
119
- category: s.category,
120
- mcp_endpoint: s.mcp_endpoint,
121
- trust_score: s.trust_score,
122
- usage_count: s.total_calls ?? 0,
123
- success_rate: s.success_rate ?? null,
124
- relevance_score: s.trust_score,
125
- }));
236
+ const scored = services.map((s) => {
237
+ const categoryBoost = intentCategories.size > 0 && s.category && intentCategories.has(s.category)
238
+ ? CATEGORY_BOOST
239
+ : 0;
240
+ return {
241
+ service_id: s.id,
242
+ name: s.name,
243
+ namespace: s.namespace,
244
+ description: s.description,
245
+ category: s.category,
246
+ mcp_endpoint: s.mcp_endpoint,
247
+ trust_score: s.trust_score,
248
+ usage_count: s.total_calls ?? 0,
249
+ success_rate: s.success_rate ?? null,
250
+ relevance_score: Math.round((s.trust_score + categoryBoost) * 100) / 100,
251
+ };
252
+ });
253
+ scored.sort((a, b) => b.relevance_score - a.relevance_score);
254
+ return scored.slice(0, limit);
126
255
  }
127
256
  //# sourceMappingURL=search-services.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"search-services.js","sourceRoot":"","sources":["../../src/tools/search-services.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"search-services.js","sourceRoot":"","sources":["../../src/tools/search-services.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,20 @@
1
+ const COMMON_SURNAMES = "佐藤|田中|鈴木|高橋|渡辺|伊藤|山本|中村|小林|加藤|吉田|山田|松本|井上|木村|林|清水|山口|阿部|池田|橋本|山下|石川|中島|前田|藤田|小川|岡田|村上|長谷川|近藤|石井|斎藤|坂本|遠藤|藤井|青木|福田|三浦|西村|太田|原|松田|中野|千葉|岩崎|河野|小野|田村|竹内";
1
2
  const patterns = [
3
+ // Japanese kanji names with honorific suffix (さん, 様, 氏)
4
+ {
5
+ regex: /[\u4E00-\u9FFF]{2,4}(?:さん|さま|様|氏)/g,
6
+ replacement: "[NAME]",
7
+ },
8
+ // Japanese full name with space: 漢字surname + space + 漢字given name
9
+ {
10
+ regex: /[\u4E00-\u9FFF]{2,3}[\s\u3000][\u4E00-\u9FFF]{1,3}/g,
11
+ replacement: "[NAME]",
12
+ },
13
+ // Common Japanese surnames followed by optional given name characters
14
+ {
15
+ regex: new RegExp(`(?:${COMMON_SURNAMES})[\u4E00-\u9FFF]{1,3}`, "g"),
16
+ replacement: "[NAME]",
17
+ },
2
18
  // Email addresses (must be before IP to avoid partial matches)
3
19
  {
4
20
  regex: /[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/g,
@@ -1 +1 @@
1
- {"version":3,"file":"pii-masker.js","sourceRoot":"","sources":["../../src/utils/pii-masker.ts"],"names":[],"mappings":"AAAA,MAAM,QAAQ,GAAkD;IAC9D,+DAA+D;IAC/D;QACE,KAAK,EAAE,iDAAiD;QACxD,WAAW,EAAE,SAAS;KACvB;IACD,6EAA6E;IAC7E,EAAE,KAAK,EAAE,qCAAqC,EAAE,WAAW,EAAE,MAAM,EAAE;IACrE,oEAAoE;IACpE,EAAE,KAAK,EAAE,2BAA2B,EAAE,WAAW,EAAE,SAAS,EAAE;IAC9D,mFAAmF;IACnF;QACE,KAAK,EAAE,oDAAoD;QAC3D,WAAW,EAAE,SAAS;KACvB;IACD,sEAAsE;IACtE,EAAE,KAAK,EAAE,mDAAmD,EAAE,WAAW,EAAE,QAAQ,EAAE;CACtF,CAAC;AAEF,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,IAAI,MAAM,GAAG,IAAI,CAAC;IAElB,KAAK,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,QAAQ,EAAE,CAAC;QAC9C,4CAA4C;QAC5C,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC;QACpB,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YACvB,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;YACrD,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC;YACpB,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;AAC1C,CAAC"}
1
+ {"version":3,"file":"pii-masker.js","sourceRoot":"","sources":["../../src/utils/pii-masker.ts"],"names":[],"mappings":"AAAA,MAAM,eAAe,GAAG,sJAAsJ,CAAC;AAE/K,MAAM,QAAQ,GAAkD;IAC9D,wDAAwD;IACxD;QACE,KAAK,EAAE,oCAAoC;QAC3C,WAAW,EAAE,QAAQ;KACtB;IACD,kEAAkE;IAClE;QACE,KAAK,EAAE,qDAAqD;QAC5D,WAAW,EAAE,QAAQ;KACtB;IACD,sEAAsE;IACtE;QACE,KAAK,EAAE,IAAI,MAAM,CAAC,MAAM,eAAe,uBAAuB,EAAE,GAAG,CAAC;QACpE,WAAW,EAAE,QAAQ;KACtB;IACD,+DAA+D;IAC/D;QACE,KAAK,EAAE,iDAAiD;QACxD,WAAW,EAAE,SAAS;KACvB;IACD,6EAA6E;IAC7E,EAAE,KAAK,EAAE,qCAAqC,EAAE,WAAW,EAAE,MAAM,EAAE;IACrE,oEAAoE;IACpE,EAAE,KAAK,EAAE,2BAA2B,EAAE,WAAW,EAAE,SAAS,EAAE;IAC9D,mFAAmF;IACnF;QACE,KAAK,EAAE,oDAAoD;QAC3D,WAAW,EAAE,SAAS;KACvB;IACD,sEAAsE;IACtE,EAAE,KAAK,EAAE,mDAAmD,EAAE,WAAW,EAAE,QAAQ,EAAE;CACtF,CAAC;AAEF,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,IAAI,MAAM,GAAG,IAAI,CAAC;IAElB,KAAK,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,QAAQ,EAAE,CAAC;QAC9C,4CAA4C;QAC5C,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC;QACpB,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YACvB,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;YACrD,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC;YACpB,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;AAC1C,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kansei-link/mcp-server",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "MCP intelligence layer for discovering and orchestrating Japanese SaaS MCP tools",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",