@x12i/api-hub-mcp 0.1.0 → 0.1.1
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/server.js +2 -1
- package/dist/server.js.map +1 -1
- package/package.json +3 -3
package/dist/server.js
CHANGED
|
@@ -7,6 +7,7 @@ const searchInput = z.object({
|
|
|
7
7
|
status: z.array(z.enum(STATUSES)).optional().describe('Only these statuses'),
|
|
8
8
|
sourcing: z.array(z.enum(SOURCINGS)).optional().describe('Only these sourcing labels'),
|
|
9
9
|
connected: z.boolean().optional().describe('true: only served capabilities that can answer now; false: served but waiting for a provider or hub'),
|
|
10
|
+
unique: z.boolean().optional().describe('true hides slugs that are aliases of another capability'),
|
|
10
11
|
limit: z.number().int().min(1).max(5000).optional().describe('Page size; all matches when omitted'),
|
|
11
12
|
offset: z.number().int().min(0).optional(),
|
|
12
13
|
});
|
|
@@ -34,7 +35,7 @@ function outcomeResult(outcome) {
|
|
|
34
35
|
const META_TOOLS = [
|
|
35
36
|
{
|
|
36
37
|
name: 'search_capabilities',
|
|
37
|
-
description: 'Search the full hub catalog (every listed capability with its status: live, planned, blocked-terms, connector, local-only, excluded).',
|
|
38
|
+
description: 'Search the full hub catalog (every listed capability with its status: live, planned, blocked-terms, connector, local-only, excluded). Pass unique: true to hide alias slugs.',
|
|
38
39
|
inputSchema: toJsonSchema(searchInput, 'input'),
|
|
39
40
|
},
|
|
40
41
|
{
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../../../../apps/mcp/src/server.ts"],"names":[],"mappings":"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","sourcesContent":["import { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { CallToolRequestSchema, ListToolsRequestSchema, type CallToolResult, type Tool } from '@modelcontextprotocol/sdk/types.js';\nimport { z } from 'zod';\nimport { anonymousAuth, HubError, SOURCINGS, STATUSES, toJsonSchema, type AuthContext } from '@x12i/api-hub-core';\nimport type { CallOutcome, Runtime } from '@x12i/api-hub-runtime';\n\nexport interface McpOptions {\n runtime: Runtime;\n // TODO(owner): the real auth layer supplies the caller identity per session.\n auth?: AuthContext;\n}\n\nconst searchInput = z.object({\n q: z.string().max(200).optional().describe('Words to match against capability slugs, names and categories'),\n status: z.array(z.enum(STATUSES)).optional().describe('Only these statuses'),\n sourcing: z.array(z.enum(SOURCINGS)).optional().describe('Only these sourcing labels'),\n connected: z.boolean().optional().describe('true: only served capabilities that can answer now; false: served but waiting for a provider or hub'),\n limit: z.number().int().min(1).max(5000).optional().describe('Page size; all matches when omitted'),\n offset: z.number().int().min(0).optional(),\n});\n\nconst describeInput = z.object({ slug: z.string().describe('Capability slug, e.g. dns-lookup') });\n\nconst callInput = z.object({\n slug: z.string().describe('Capability slug'),\n input: z.record(z.string(), z.unknown()).default({}).describe('Input object for the capability'),\n});\n\nfunction json(value: unknown): CallToolResult {\n return {\n content: [{ type: 'text', text: JSON.stringify(value) }],\n structuredContent: value as Record<string, unknown>,\n };\n}\n\nfunction errorResult(error: HubError): CallToolResult {\n return { isError: true, content: [{ type: 'text', text: JSON.stringify(error.toBody()) }], structuredContent: error.toBody() as unknown as Record<string, unknown> };\n}\n\nfunction outcomeResult(outcome: CallOutcome): CallToolResult {\n if (outcome.kind === 'error') return errorResult(outcome.error);\n if (outcome.kind === 'job') return json({ job: outcome.job, statusUrl: `/v1/jobs/${outcome.job.id}` });\n return json(outcome.output as Record<string, unknown>);\n}\n\nconst META_TOOLS: Tool[] = [\n {\n name: 'search_capabilities',\n description: 'Search the full hub catalog (every listed capability with its status: live, planned, blocked-terms, connector, local-only, excluded).',\n inputSchema: toJsonSchema(searchInput, 'input') as Tool['inputSchema'],\n },\n {\n name: 'describe_capability',\n description:\n 'Describe one capability: status, whether it is connected and what is missing, sourcing, hubs that offer it, and input and output schemas when it is served.',\n inputSchema: toJsonSchema(describeInput, 'input') as Tool['inputSchema'],\n },\n {\n name: 'list_connections',\n description: 'List the providers and upstream hubs this server can use, whether each is connected, and how many capabilities each unlocks.',\n inputSchema: { type: 'object', properties: {} },\n },\n {\n name: 'call_capability',\n description: 'Call any served capability by slug with an input object.',\n inputSchema: toJsonSchema(callInput, 'input') as Tool['inputSchema'],\n },\n];\n\nexport function capabilityTools(runtime: Runtime): Tool[] {\n return runtime.registry.servedCapabilities().map((cap) => ({\n name: cap.slug,\n description: cap.summary,\n inputSchema: toJsonSchema(cap.input, 'input') as Tool['inputSchema'],\n ...(cap.mode === 'sync' ? { outputSchema: toJsonSchema(cap.output, 'output') as Tool['outputSchema'] } : {}),\n }));\n}\n\nexport function createMcpServer(options: McpOptions): Server {\n const { runtime } = options;\n const auth = options.auth ?? anonymousAuth;\n const server = new Server({ name: 'x12i-api-hub', version: '0.1.0' }, { capabilities: { tools: {} } });\n const capTools = capabilityTools(runtime);\n const capToolNames = new Set(capTools.map((t) => t.name));\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: [...META_TOOLS, ...capTools] }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request, extra): Promise<CallToolResult> => {\n const { name, arguments: args = {} } = request.params;\n const invalid = (error: z.ZodError) =>\n errorResult(new HubError('invalid_input', 'Invalid tool arguments', { issues: error.issues.map((i) => i.message) }));\n\n switch (name) {\n case 'search_capabilities': {\n const parsed = searchInput.safeParse(args);\n if (!parsed.success) return invalid(parsed.error);\n return json(runtime.list(parsed.data));\n }\n case 'describe_capability': {\n const parsed = describeInput.safeParse(args);\n if (!parsed.success) return invalid(parsed.error);\n const described = runtime.describe(parsed.data.slug);\n return described ? json(described) : errorResult(new HubError('unsupported', `Unknown capability: ${parsed.data.slug}`));\n }\n case 'list_connections':\n return json({ items: runtime.connections() });\n case 'call_capability': {\n const parsed = callInput.safeParse(args);\n if (!parsed.success) return invalid(parsed.error);\n return outcomeResult(await runtime.call(parsed.data.slug, parsed.data.input, { auth, signal: extra.signal }));\n }\n default:\n if (!capToolNames.has(name)) return errorResult(new HubError('unsupported', `Unknown tool: ${name}`));\n return outcomeResult(await runtime.call(name, args, { auth, signal: extra.signal }));\n }\n });\n\n return server;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../../../../apps/mcp/src/server.ts"],"names":[],"mappings":"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","sourcesContent":["import { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { CallToolRequestSchema, ListToolsRequestSchema, type CallToolResult, type Tool } from '@modelcontextprotocol/sdk/types.js';\nimport { z } from 'zod';\nimport { anonymousAuth, HubError, SOURCINGS, STATUSES, toJsonSchema, type AuthContext } from '@x12i/api-hub-core';\nimport type { CallOutcome, Runtime } from '@x12i/api-hub-runtime';\n\nexport interface McpOptions {\n runtime: Runtime;\n // TODO(owner): the real auth layer supplies the caller identity per session.\n auth?: AuthContext;\n}\n\nconst searchInput = z.object({\n q: z.string().max(200).optional().describe('Words to match against capability slugs, names and categories'),\n status: z.array(z.enum(STATUSES)).optional().describe('Only these statuses'),\n sourcing: z.array(z.enum(SOURCINGS)).optional().describe('Only these sourcing labels'),\n connected: z.boolean().optional().describe('true: only served capabilities that can answer now; false: served but waiting for a provider or hub'),\n unique: z.boolean().optional().describe('true hides slugs that are aliases of another capability'),\n limit: z.number().int().min(1).max(5000).optional().describe('Page size; all matches when omitted'),\n offset: z.number().int().min(0).optional(),\n});\n\nconst describeInput = z.object({ slug: z.string().describe('Capability slug, e.g. dns-lookup') });\n\nconst callInput = z.object({\n slug: z.string().describe('Capability slug'),\n input: z.record(z.string(), z.unknown()).default({}).describe('Input object for the capability'),\n});\n\nfunction json(value: unknown): CallToolResult {\n return {\n content: [{ type: 'text', text: JSON.stringify(value) }],\n structuredContent: value as Record<string, unknown>,\n };\n}\n\nfunction errorResult(error: HubError): CallToolResult {\n return { isError: true, content: [{ type: 'text', text: JSON.stringify(error.toBody()) }], structuredContent: error.toBody() as unknown as Record<string, unknown> };\n}\n\nfunction outcomeResult(outcome: CallOutcome): CallToolResult {\n if (outcome.kind === 'error') return errorResult(outcome.error);\n if (outcome.kind === 'job') return json({ job: outcome.job, statusUrl: `/v1/jobs/${outcome.job.id}` });\n return json(outcome.output as Record<string, unknown>);\n}\n\nconst META_TOOLS: Tool[] = [\n {\n name: 'search_capabilities',\n description: 'Search the full hub catalog (every listed capability with its status: live, planned, blocked-terms, connector, local-only, excluded). Pass unique: true to hide alias slugs.',\n inputSchema: toJsonSchema(searchInput, 'input') as Tool['inputSchema'],\n },\n {\n name: 'describe_capability',\n description:\n 'Describe one capability: status, whether it is connected and what is missing, sourcing, hubs that offer it, and input and output schemas when it is served.',\n inputSchema: toJsonSchema(describeInput, 'input') as Tool['inputSchema'],\n },\n {\n name: 'list_connections',\n description: 'List the providers and upstream hubs this server can use, whether each is connected, and how many capabilities each unlocks.',\n inputSchema: { type: 'object', properties: {} },\n },\n {\n name: 'call_capability',\n description: 'Call any served capability by slug with an input object.',\n inputSchema: toJsonSchema(callInput, 'input') as Tool['inputSchema'],\n },\n];\n\nexport function capabilityTools(runtime: Runtime): Tool[] {\n return runtime.registry.servedCapabilities().map((cap) => ({\n name: cap.slug,\n description: cap.summary,\n inputSchema: toJsonSchema(cap.input, 'input') as Tool['inputSchema'],\n ...(cap.mode === 'sync' ? { outputSchema: toJsonSchema(cap.output, 'output') as Tool['outputSchema'] } : {}),\n }));\n}\n\nexport function createMcpServer(options: McpOptions): Server {\n const { runtime } = options;\n const auth = options.auth ?? anonymousAuth;\n const server = new Server({ name: 'x12i-api-hub', version: '0.1.0' }, { capabilities: { tools: {} } });\n const capTools = capabilityTools(runtime);\n const capToolNames = new Set(capTools.map((t) => t.name));\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: [...META_TOOLS, ...capTools] }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request, extra): Promise<CallToolResult> => {\n const { name, arguments: args = {} } = request.params;\n const invalid = (error: z.ZodError) =>\n errorResult(new HubError('invalid_input', 'Invalid tool arguments', { issues: error.issues.map((i) => i.message) }));\n\n switch (name) {\n case 'search_capabilities': {\n const parsed = searchInput.safeParse(args);\n if (!parsed.success) return invalid(parsed.error);\n return json(runtime.list(parsed.data));\n }\n case 'describe_capability': {\n const parsed = describeInput.safeParse(args);\n if (!parsed.success) return invalid(parsed.error);\n const described = runtime.describe(parsed.data.slug);\n return described ? json(described) : errorResult(new HubError('unsupported', `Unknown capability: ${parsed.data.slug}`));\n }\n case 'list_connections':\n return json({ items: runtime.connections() });\n case 'call_capability': {\n const parsed = callInput.safeParse(args);\n if (!parsed.success) return invalid(parsed.error);\n return outcomeResult(await runtime.call(parsed.data.slug, parsed.data.input, { auth, signal: extra.signal }));\n }\n default:\n if (!capToolNames.has(name)) return errorResult(new HubError('unsupported', `Unknown tool: ${name}`));\n return outcomeResult(await runtime.call(name, args, { auth, signal: extra.signal }));\n }\n });\n\n return server;\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@x12i/api-hub-mcp",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "MCP server for the x12i API hub",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"engines": {
|
|
@@ -39,8 +39,8 @@
|
|
|
39
39
|
"access": "public"
|
|
40
40
|
},
|
|
41
41
|
"dependencies": {
|
|
42
|
-
"@x12i/api-hub-core": "0.1.
|
|
43
|
-
"@x12i/api-hub-runtime": "0.1.
|
|
42
|
+
"@x12i/api-hub-core": "0.1.1",
|
|
43
|
+
"@x12i/api-hub-runtime": "0.1.1",
|
|
44
44
|
"@modelcontextprotocol/sdk": "1.32.2",
|
|
45
45
|
"zod": "4.6.7"
|
|
46
46
|
}
|