@one-source/mcp 1.0.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/LICENSE ADDED
@@ -0,0 +1,9 @@
1
+ Copyright (c) 2026 BlockParty. All rights reserved.
2
+
3
+ This software and associated documentation files (the "Software") are proprietary
4
+ and confidential. No part of the Software may be reproduced, distributed, or
5
+ transmitted in any form or by any means without the prior written permission of
6
+ BlockParty.
7
+
8
+ Unauthorized copying, modification, distribution, or use of this Software,
9
+ via any medium, is strictly prohibited.
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Unified analytics wrapper.
3
+ *
4
+ * Uses api-mcp's analytics implementation (superset — includes trackHttp which
5
+ * docs-mcp lacks) and widens ToolCallEvent.category to include 'docs'.
6
+ * The underlying implementations (Noop/Stderr/Dashboard) serialize events to
7
+ * JSON, so the wider category type is safe at runtime.
8
+ */
9
+ import { type Analytics as _Analytics, type ToolCallEvent as _ToolCallEvent, type HttpCallEvent, type ServiceEvent } from '@one-source/api-mcp/analytics';
10
+ /** ToolCallEvent with category widened to include docs tools. */
11
+ export type ToolCallEvent = Omit<_ToolCallEvent, 'category'> & {
12
+ category: _ToolCallEvent['category'] | 'docs';
13
+ };
14
+ /** Analytics interface with trackTool accepting the widened ToolCallEvent. */
15
+ export interface Analytics extends Omit<_Analytics, 'trackTool'> {
16
+ trackTool(event: ToolCallEvent): void;
17
+ }
18
+ /** Create an analytics instance (Noop, Stderr, or Dashboard based on env vars). */
19
+ export declare function createAnalytics(): Analytics;
20
+ export type { HttpCallEvent, ServiceEvent };
21
+ //# sourceMappingURL=analytics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytics.d.ts","sourceRoot":"","sources":["../src/analytics.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAEL,KAAK,SAAS,IAAI,UAAU,EAC5B,KAAK,aAAa,IAAI,cAAc,EACpC,KAAK,aAAa,EAClB,KAAK,YAAY,EAClB,MAAM,+BAA+B,CAAC;AAEvC,iEAAiE;AACjE,MAAM,MAAM,aAAa,GAAG,IAAI,CAAC,cAAc,EAAE,UAAU,CAAC,GAAG;IAC7D,QAAQ,EAAE,cAAc,CAAC,UAAU,CAAC,GAAG,MAAM,CAAC;CAC/C,CAAC;AAEF,8EAA8E;AAC9E,MAAM,WAAW,SAAU,SAAQ,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC;IAC9D,SAAS,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAAC;CACvC;AAED,mFAAmF;AACnF,wBAAgB,eAAe,IAAI,SAAS,CAE3C;AAED,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Unified analytics wrapper.
3
+ *
4
+ * Uses api-mcp's analytics implementation (superset — includes trackHttp which
5
+ * docs-mcp lacks) and widens ToolCallEvent.category to include 'docs'.
6
+ * The underlying implementations (Noop/Stderr/Dashboard) serialize events to
7
+ * JSON, so the wider category type is safe at runtime.
8
+ */
9
+ import { createAnalytics as _createAnalytics, } from '@one-source/api-mcp/analytics';
10
+ /** Create an analytics instance (Noop, Stderr, or Dashboard based on env vars). */
11
+ export function createAnalytics() {
12
+ return _createAnalytics();
13
+ }
14
+ //# sourceMappingURL=analytics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytics.js","sourceRoot":"","sources":["../src/analytics.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EACL,eAAe,IAAI,gBAAgB,GAKpC,MAAM,+BAA+B,CAAC;AAYvC,mFAAmF;AACnF,MAAM,UAAU,eAAe;IAC7B,OAAO,gBAAgB,EAAe,CAAC;AACzC,CAAC"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * CLI entry point for onesource-mcp (unified server).
4
+ *
5
+ * Usage:
6
+ * npx onesource-mcp # stdio mode (default)
7
+ * npx onesource-mcp --http # HTTP server on port 3000
8
+ * npx onesource-mcp --http --port=8080
9
+ */
10
+ export {};
11
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;;;;GAOG;AA0LH,OAAO,EAAE,CAAC"}
package/dist/cli.js ADDED
@@ -0,0 +1,167 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * CLI entry point for onesource-mcp (unified server).
4
+ *
5
+ * Usage:
6
+ * npx onesource-mcp # stdio mode (default)
7
+ * npx onesource-mcp --http # HTTP server on port 3000
8
+ * npx onesource-mcp --http --port=8080
9
+ */
10
+ const args = process.argv.slice(2);
11
+ if (args.includes('--http')) {
12
+ // ---------- HTTP mode ----------
13
+ // Parse --port=N or --port N
14
+ const portArgIdx = args.findIndex((a) => a === '--port' || a.startsWith('--port='));
15
+ let port = 3000;
16
+ if (portArgIdx !== -1) {
17
+ const arg = args[portArgIdx];
18
+ const portStr = arg.startsWith('--port=')
19
+ ? arg.split('=')[1]
20
+ : args[portArgIdx + 1];
21
+ const parsed = parseInt(portStr ?? '', 10);
22
+ if (!portStr || isNaN(parsed) || parsed < 1 || parsed > 65535) {
23
+ console.error(`Error: Invalid port "${portStr ?? ''}". Must be between 1 and 65535.`);
24
+ process.exit(1);
25
+ }
26
+ port = parsed;
27
+ }
28
+ const { StreamableHTTPServerTransport } = await import('@modelcontextprotocol/sdk/server/streamableHttp.js');
29
+ const { createServer } = await import('node:http');
30
+ const { createMcpServer, loadData, VERSION } = await import('./create-server.js');
31
+ const { createAnalytics } = await import('./analytics.js');
32
+ const { createClientFromEnv } = await import('@one-source/api-mcp/client');
33
+ // Pre-load docs data once at startup
34
+ const docsData = loadData();
35
+ // Shared singletons — reused across stateless per-request servers
36
+ const sharedAnalytics = createAnalytics();
37
+ const sharedClient = createClientFromEnv();
38
+ const httpServer = createServer(async (req, res) => {
39
+ // CORS headers
40
+ res.setHeader('Access-Control-Allow-Origin', '*');
41
+ res.setHeader('Access-Control-Allow-Methods', 'POST, GET, OPTIONS');
42
+ res.setHeader('Access-Control-Allow-Headers', 'Content-Type, mcp-session-id');
43
+ // CORS preflight
44
+ if (req.method === 'OPTIONS') {
45
+ res.writeHead(204).end();
46
+ return;
47
+ }
48
+ // Health check
49
+ if (req.method === 'GET' && req.url === '/health') {
50
+ res.writeHead(200, { 'Content-Type': 'application/json' });
51
+ res.end(JSON.stringify({
52
+ status: 'ok',
53
+ server: 'onesource-mcp',
54
+ version: VERSION,
55
+ tools: 43,
56
+ }));
57
+ return;
58
+ }
59
+ // MCP only accepts POST (stateless mode)
60
+ if (req.method !== 'POST') {
61
+ res.writeHead(405, { 'Content-Type': 'application/json' });
62
+ res.end(JSON.stringify({
63
+ jsonrpc: '2.0',
64
+ error: { code: -32000, message: 'Method not allowed' },
65
+ id: null,
66
+ }));
67
+ return;
68
+ }
69
+ // Fresh server per request (SDK stateless pattern), shared singletons
70
+ const { server } = createMcpServer({
71
+ docsData,
72
+ analytics: sharedAnalytics,
73
+ client: sharedClient,
74
+ transport: 'http',
75
+ });
76
+ const httpTransport = new StreamableHTTPServerTransport({
77
+ sessionIdGenerator: undefined,
78
+ });
79
+ // Register cleanup before handleRequest so it runs even if handleRequest throws
80
+ res.on('close', () => {
81
+ httpTransport.close();
82
+ server.close();
83
+ });
84
+ try {
85
+ await server.connect(httpTransport);
86
+ await httpTransport.handleRequest(req, res);
87
+ }
88
+ catch {
89
+ if (!res.headersSent) {
90
+ res.writeHead(500, { 'Content-Type': 'application/json' });
91
+ res.end(JSON.stringify({
92
+ jsonrpc: '2.0',
93
+ error: { code: -32603, message: 'Internal server error' },
94
+ id: null,
95
+ }));
96
+ }
97
+ }
98
+ });
99
+ // Bind to localhost only — no network exposure
100
+ httpServer.listen(port, '127.0.0.1', () => {
101
+ console.error(`[onesource] HTTP server listening on http://127.0.0.1:${port}`);
102
+ console.error(`[onesource] MCP endpoint: POST http://127.0.0.1:${port}/`);
103
+ console.error(`[onesource] Health: GET http://127.0.0.1:${port}/health`);
104
+ });
105
+ sharedAnalytics.trackService({
106
+ type: 'service_start',
107
+ service: 'onesource',
108
+ timestamp: new Date().toISOString(),
109
+ version: VERSION,
110
+ details: `http:${port}`,
111
+ });
112
+ // Graceful shutdown — flush analytics before exit
113
+ process.once('SIGINT', async () => {
114
+ sharedAnalytics.trackService({
115
+ type: 'service_stop',
116
+ service: 'onesource',
117
+ timestamp: new Date().toISOString(),
118
+ version: VERSION,
119
+ });
120
+ sharedAnalytics.stop();
121
+ await Promise.race([
122
+ (async () => {
123
+ await sharedAnalytics.flush();
124
+ await new Promise((resolve) => httpServer.close(() => resolve()));
125
+ })(),
126
+ new Promise((resolve) => setTimeout(resolve, 5_000)),
127
+ ]);
128
+ process.exit(0);
129
+ });
130
+ }
131
+ else {
132
+ // ---------- Stdio mode (default) ----------
133
+ const { createMcpServer, VERSION } = await import('./create-server.js');
134
+ const { StdioServerTransport } = await import('@modelcontextprotocol/sdk/server/stdio.js');
135
+ const { server, analytics } = createMcpServer({ transport: 'stdio' });
136
+ const stdioTransport = new StdioServerTransport();
137
+ await server.connect(stdioTransport);
138
+ console.error('[onesource] Server connected via stdio');
139
+ analytics.trackService({
140
+ type: 'service_start',
141
+ service: 'onesource',
142
+ timestamp: new Date().toISOString(),
143
+ version: VERSION,
144
+ details: 'stdio',
145
+ });
146
+ // Graceful shutdown — flush analytics before exit
147
+ process.once('SIGINT', async () => {
148
+ analytics.trackService({
149
+ type: 'service_stop',
150
+ service: 'onesource',
151
+ timestamp: new Date().toISOString(),
152
+ version: VERSION,
153
+ });
154
+ analytics.stop();
155
+ await Promise.race([
156
+ (async () => {
157
+ await analytics.flush();
158
+ stdioTransport.close();
159
+ await server.close();
160
+ })(),
161
+ new Promise((resolve) => setTimeout(resolve, 5_000)),
162
+ ]);
163
+ process.exit(0);
164
+ });
165
+ }
166
+ export {};
167
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Unified MCP Server Factory
3
+ *
4
+ * Creates a single McpServer named 'onesource' with all 43 tools
5
+ * (34 API + 9 docs) by delegating to the two register modules.
6
+ */
7
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
8
+ import type { OneSourceClient } from '@one-source/api-mcp/client';
9
+ import { loadData, type LoadedData } from './register-docs-tools.js';
10
+ import { type Analytics } from './analytics.js';
11
+ import { VERSION } from './version.js';
12
+ export interface CreateServerOptions {
13
+ /** Pre-loaded docs content (avoids re-reading files per request in HTTP mode). */
14
+ docsData?: LoadedData;
15
+ /** Override the default analytics instance (for sharing across HTTP requests). */
16
+ analytics?: Analytics;
17
+ /** Override the default API client (for sharing across HTTP requests). */
18
+ client?: OneSourceClient;
19
+ /** Transport mode — passed through to analytics events. */
20
+ transport?: 'stdio' | 'http';
21
+ }
22
+ export interface CreateServerResult {
23
+ server: McpServer;
24
+ analytics: Analytics;
25
+ client: OneSourceClient;
26
+ toolCount: number;
27
+ }
28
+ /**
29
+ * Create a unified MCP server with all OneSource tools.
30
+ */
31
+ export declare function createMcpServer(opts?: CreateServerOptions): CreateServerResult;
32
+ export { loadData, type LoadedData };
33
+ export { VERSION };
34
+ export { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
35
+ //# sourceMappingURL=create-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-server.d.ts","sourceRoot":"","sources":["../src/create-server.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAElE,OAAO,EAAqB,QAAQ,EAAE,KAAK,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACxF,OAAO,EAAmB,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACjE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,MAAM,WAAW,mBAAmB;IAClC,kFAAkF;IAClF,QAAQ,CAAC,EAAE,UAAU,CAAC;IACtB,kFAAkF;IAClF,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,0EAA0E;IAC1E,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB,2DAA2D;IAC3D,SAAS,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,SAAS,CAAC;IAClB,SAAS,EAAE,SAAS,CAAC;IACrB,MAAM,EAAE,eAAe,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,CAAC,EAAE,mBAAmB,GAAG,kBAAkB,CAwB9E;AAED,OAAO,EAAE,QAAQ,EAAE,KAAK,UAAU,EAAE,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,CAAC;AACnB,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Unified MCP Server Factory
3
+ *
4
+ * Creates a single McpServer named 'onesource' with all 43 tools
5
+ * (34 API + 9 docs) by delegating to the two register modules.
6
+ */
7
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
8
+ import { registerApiTools } from './register-api-tools.js';
9
+ import { registerDocsTools, loadData } from './register-docs-tools.js';
10
+ import { createAnalytics } from './analytics.js';
11
+ import { VERSION } from './version.js';
12
+ /**
13
+ * Create a unified MCP server with all OneSource tools.
14
+ */
15
+ export function createMcpServer(opts) {
16
+ const analytics = opts?.analytics ?? createAnalytics();
17
+ const transport = opts?.transport;
18
+ const server = new McpServer({
19
+ name: 'onesource',
20
+ version: VERSION,
21
+ });
22
+ const { client, count: apiCount } = registerApiTools({
23
+ server,
24
+ analytics,
25
+ transport,
26
+ client: opts?.client,
27
+ });
28
+ const docsCount = registerDocsTools({
29
+ server,
30
+ analytics,
31
+ transport,
32
+ data: opts?.docsData,
33
+ });
34
+ return { server, analytics, client, toolCount: apiCount + docsCount };
35
+ }
36
+ export { loadData };
37
+ export { VERSION };
38
+ export { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
39
+ //# sourceMappingURL=create-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-server.js","sourceRoot":"","sources":["../src/create-server.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAmB,MAAM,0BAA0B,CAAC;AACxF,OAAO,EAAE,eAAe,EAAkB,MAAM,gBAAgB,CAAC;AACjE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAoBvC;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,IAA0B;IACxD,MAAM,SAAS,GAAG,IAAI,EAAE,SAAS,IAAI,eAAe,EAAE,CAAC;IACvD,MAAM,SAAS,GAAG,IAAI,EAAE,SAAS,CAAC;IAElC,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,OAAO;KACjB,CAAC,CAAC;IAEH,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,gBAAgB,CAAC;QACnD,MAAM;QACN,SAAS;QACT,SAAS;QACT,MAAM,EAAE,IAAI,EAAE,MAAM;KACrB,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,iBAAiB,CAAC;QAClC,MAAM;QACN,SAAS;QACT,SAAS;QACT,IAAI,EAAE,IAAI,EAAE,QAAQ;KACrB,CAAC,CAAC;IAEH,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,GAAG,SAAS,EAAE,CAAC;AACxE,CAAC;AAED,OAAO,EAAE,QAAQ,EAAmB,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,CAAC;AACnB,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Register all 34 API tools from @one-source/api-mcp onto a shared McpServer.
3
+ *
4
+ * Replicates the exact instrumentation pattern from api-mcp's create-server.ts:
5
+ * per-call client context, x402 detection, performance timing, session hashing,
6
+ * and error sanitization.
7
+ */
8
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
9
+ import { type OneSourceClient } from '@one-source/api-mcp/client';
10
+ import type { Analytics } from './analytics.js';
11
+ export interface RegisterApiToolsOptions {
12
+ server: McpServer;
13
+ analytics: Analytics;
14
+ transport?: 'stdio' | 'http';
15
+ /** Override the default client (useful for sharing across HTTP requests). */
16
+ client?: OneSourceClient;
17
+ }
18
+ /**
19
+ * Register all API tools and return the client instance + tool count.
20
+ */
21
+ export declare function registerApiTools(opts: RegisterApiToolsOptions): {
22
+ client: OneSourceClient;
23
+ count: number;
24
+ };
25
+ //# sourceMappingURL=register-api-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register-api-tools.d.ts","sourceRoot":"","sources":["../src/register-api-tools.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,OAAO,EAAuB,KAAK,eAAe,EAAE,MAAM,4BAA4B,CAAC;AACvF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAQhD,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,SAAS,CAAC;IAClB,SAAS,EAAE,SAAS,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC7B,6EAA6E;IAC7E,MAAM,CAAC,EAAE,eAAe,CAAC;CAC1B;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,uBAAuB,GAC5B;IAAE,MAAM,EAAE,eAAe,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAiH5C"}
@@ -0,0 +1,122 @@
1
+ /**
2
+ * Register all 34 API tools from @one-source/api-mcp onto a shared McpServer.
3
+ *
4
+ * Replicates the exact instrumentation pattern from api-mcp's create-server.ts:
5
+ * per-call client context, x402 detection, performance timing, session hashing,
6
+ * and error sanitization.
7
+ */
8
+ import { createHash } from 'node:crypto';
9
+ import { allTools } from '@one-source/api-mcp/tools';
10
+ import { createClientFromEnv } from '@one-source/api-mcp/client';
11
+ import { VERSION } from './version.js';
12
+ function hashSession(sessionId) {
13
+ if (!sessionId)
14
+ return undefined;
15
+ return createHash('sha256').update(sessionId).digest('hex').slice(0, 16);
16
+ }
17
+ /**
18
+ * Register all API tools and return the client instance + tool count.
19
+ */
20
+ export function registerApiTools(opts) {
21
+ const { server, analytics, transport } = opts;
22
+ const client = opts.client ?? createClientFromEnv();
23
+ // Wire HTTP-level analytics from base client (default handler for non-overridden calls)
24
+ client.onHttpEvent = (event) => {
25
+ analytics.trackHttp({
26
+ type: 'http_call',
27
+ service: 'onesource-api',
28
+ tool: event.tool,
29
+ http_status: event.http_status,
30
+ backend_latency_ms: event.backend_latency_ms,
31
+ x402_required: event.x402_required,
32
+ timestamp: new Date().toISOString(),
33
+ });
34
+ };
35
+ for (const tool of allTools) {
36
+ server.registerTool(tool.name, {
37
+ description: tool.description,
38
+ inputSchema: tool.schema,
39
+ }, async (input, extra) => {
40
+ const start = performance.now();
41
+ const inputRecord = input;
42
+ const inputKeys = Object.keys(inputRecord);
43
+ const network = inputRecord.network;
44
+ const sessionHash = hashSession(extra.sessionId);
45
+ const clientInfo = server.server.getClientVersion();
46
+ // Per-call client with tool context — avoids race condition on shared client
47
+ const toolClient = client.withContext({ tool: tool.name });
48
+ // Track x402 status per-call via closure — no shared mutable state
49
+ let x402Seen = false;
50
+ toolClient.onHttpEvent = (event) => {
51
+ if (event.x402_required)
52
+ x402Seen = true;
53
+ analytics.trackHttp({
54
+ type: 'http_call',
55
+ service: 'onesource-api',
56
+ tool: event.tool,
57
+ http_status: event.http_status,
58
+ backend_latency_ms: event.backend_latency_ms,
59
+ x402_required: event.x402_required,
60
+ timestamp: new Date().toISOString(),
61
+ session_id: sessionHash,
62
+ });
63
+ };
64
+ try {
65
+ const text = await tool.handler(inputRecord, toolClient);
66
+ const durationMs = Math.round(performance.now() - start);
67
+ analytics.trackTool({
68
+ type: 'tool_call',
69
+ service: 'onesource-api',
70
+ tool: tool.name,
71
+ category: tool.category,
72
+ timestamp: new Date().toISOString(),
73
+ duration_ms: durationMs,
74
+ success: true,
75
+ network,
76
+ input_params: inputKeys,
77
+ response_size: text.length,
78
+ version: VERSION,
79
+ auth_method: x402Seen ? 'x402' : 'none',
80
+ client_name: clientInfo?.name,
81
+ client_version: clientInfo?.version,
82
+ session_id: sessionHash,
83
+ transport,
84
+ });
85
+ return {
86
+ content: [{ type: 'text', text }],
87
+ };
88
+ }
89
+ catch (err) {
90
+ const durationMs = Math.round(performance.now() - start);
91
+ const message = err instanceof Error ? err.message : String(err);
92
+ analytics.trackTool({
93
+ type: 'tool_call',
94
+ service: 'onesource-api',
95
+ tool: tool.name,
96
+ category: tool.category,
97
+ timestamp: new Date().toISOString(),
98
+ duration_ms: durationMs,
99
+ success: false,
100
+ error_category: message.slice(0, 100).replace(/0x[a-fA-F0-9]+/g, '0x***'),
101
+ network,
102
+ input_params: inputKeys,
103
+ response_size: 0,
104
+ version: VERSION,
105
+ auth_method: x402Seen ? 'x402' : 'none',
106
+ client_name: clientInfo?.name,
107
+ client_version: clientInfo?.version,
108
+ session_id: sessionHash,
109
+ transport,
110
+ });
111
+ return {
112
+ isError: true,
113
+ content: [
114
+ { type: 'text', text: `Tool error: ${message.slice(0, 500)}` },
115
+ ],
116
+ };
117
+ }
118
+ });
119
+ }
120
+ return { client, count: allTools.length };
121
+ }
122
+ //# sourceMappingURL=register-api-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register-api-tools.js","sourceRoot":"","sources":["../src/register-api-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Register all 9 docs tools from @one-source/docs-mcp onto a shared McpServer.
3
+ *
4
+ * Replicates the exact instrumentation pattern from docs-mcp's create-server.ts:
5
+ * performance timing, session hashing, and error sanitization.
6
+ * Analytics events use service: 'onesource-docs', category: 'docs'.
7
+ */
8
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
9
+ import { loadData, type LoadedData } from '@one-source/docs-mcp';
10
+ import type { Analytics } from './analytics.js';
11
+ export interface RegisterDocsToolsOptions {
12
+ server: McpServer;
13
+ analytics: Analytics;
14
+ transport?: 'stdio' | 'http';
15
+ /** Pre-loaded docs data (avoids re-reading files per request in HTTP mode). */
16
+ data?: LoadedData;
17
+ }
18
+ /**
19
+ * Register all docs tools and return the tool count.
20
+ */
21
+ export declare function registerDocsTools(opts: RegisterDocsToolsOptions): number;
22
+ export { loadData, type LoadedData };
23
+ //# sourceMappingURL=register-docs-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register-docs-tools.d.ts","sourceRoot":"","sources":["../src/register-docs-tools.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKzE,OAAO,EAAE,QAAQ,EAAE,KAAK,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAWjE,OAAO,KAAK,EAAE,SAAS,EAAiB,MAAM,gBAAgB,CAAC;AA+E/D,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,SAAS,CAAC;IAClB,SAAS,EAAE,SAAS,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC7B,+EAA+E;IAC/E,IAAI,CAAC,EAAE,UAAU,CAAC;CACnB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,wBAAwB,GAAG,MAAM,CAoExE;AAED,OAAO,EAAE,QAAQ,EAAE,KAAK,UAAU,EAAE,CAAC"}
@@ -0,0 +1,102 @@
1
+ /**
2
+ * Register all 9 docs tools from @one-source/docs-mcp onto a shared McpServer.
3
+ *
4
+ * Replicates the exact instrumentation pattern from docs-mcp's create-server.ts:
5
+ * performance timing, session hashing, and error sanitization.
6
+ * Analytics events use service: 'onesource-docs', category: 'docs'.
7
+ */
8
+ import { createHash } from 'node:crypto';
9
+ import { loadData } from '@one-source/docs-mcp';
10
+ import { searchDocsSchema, handleSearchDocs } from '@one-source/docs-mcp/tools/search-docs';
11
+ import { getQueryReferenceSchema, handleGetQueryReference } from '@one-source/docs-mcp/tools/get-query-reference';
12
+ import { getTypeDefinitionSchema, handleGetTypeDefinition } from '@one-source/docs-mcp/tools/get-type-definition';
13
+ import { listExamplesSchema, handleListExamples } from '@one-source/docs-mcp/tools/list-examples';
14
+ import { listSupportedChainsSchema, handleListSupportedChains } from '@one-source/docs-mcp/tools/list-supported-chains';
15
+ import { getFilterReferenceSchema, handleGetFilterReference } from '@one-source/docs-mcp/tools/get-filter-reference';
16
+ import { getPaginationGuideSchema, handleGetPaginationGuide } from '@one-source/docs-mcp/tools/get-pagination-guide';
17
+ import { getSchemaOverviewSchema, handleGetSchemaOverview } from '@one-source/docs-mcp/tools/get-schema-overview';
18
+ import { getAuthenticationGuideSchema, handleGetAuthenticationGuide } from '@one-source/docs-mcp/tools/get-authentication-guide';
19
+ import { VERSION } from './version.js';
20
+ function hashSession(sessionId) {
21
+ if (!sessionId)
22
+ return undefined;
23
+ return createHash('sha256').update(sessionId).digest('hex').slice(0, 16);
24
+ }
25
+ /**
26
+ * Register an instrumented docs tool — wraps the handler with analytics tracking.
27
+ *
28
+ * Uses `any` for the handler input type because the MCP SDK's overloaded
29
+ * `server.tool()` signature makes generics impractical here. Each handler
30
+ * is still type-safe at its own definition site.
31
+ */
32
+ function instrumentedTool(server, analytics, transport, name, description,
33
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
34
+ schema,
35
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
36
+ handler) {
37
+ server.tool(name, description, schema, async (input, extra) => {
38
+ const start = performance.now();
39
+ const inputKeys = Object.keys(input);
40
+ const sessionHash = hashSession(extra.sessionId);
41
+ const clientInfo = server.server.getClientVersion();
42
+ const base = {
43
+ type: 'tool_call',
44
+ service: 'onesource-docs',
45
+ tool: name,
46
+ category: 'docs',
47
+ timestamp: new Date().toISOString(),
48
+ input_params: inputKeys,
49
+ version: VERSION,
50
+ auth_method: 'none',
51
+ client_name: clientInfo?.name,
52
+ client_version: clientInfo?.version,
53
+ session_id: sessionHash,
54
+ transport,
55
+ };
56
+ try {
57
+ const text = handler(input);
58
+ const durationMs = Math.round(performance.now() - start);
59
+ analytics.trackTool({
60
+ ...base,
61
+ duration_ms: durationMs,
62
+ success: true,
63
+ response_size: text.length,
64
+ });
65
+ return { content: [{ type: 'text', text }] };
66
+ }
67
+ catch (err) {
68
+ const durationMs = Math.round(performance.now() - start);
69
+ const message = err instanceof Error ? err.message : String(err);
70
+ analytics.trackTool({
71
+ ...base,
72
+ duration_ms: durationMs,
73
+ success: false,
74
+ error_category: message.slice(0, 100).replace(/0x[a-fA-F0-9]+/g, '0x***'),
75
+ response_size: 0,
76
+ });
77
+ return {
78
+ isError: true,
79
+ content: [{ type: 'text', text: `Tool error: ${message.slice(0, 500).replace(/0x[a-fA-F0-9]+/g, '0x***')}` }],
80
+ };
81
+ }
82
+ });
83
+ }
84
+ /**
85
+ * Register all docs tools and return the tool count.
86
+ */
87
+ export function registerDocsTools(opts) {
88
+ const { server, analytics, transport } = opts;
89
+ const { sections, index, schema } = opts.data ?? loadData();
90
+ instrumentedTool(server, analytics, transport, 'search_docs', 'Search OneSource documentation by keyword. Returns the top 5 matching sections.', searchDocsSchema.shape, (input) => handleSearchDocs(input, index));
91
+ instrumentedTool(server, analytics, transport, 'get_query_reference', 'Get full reference for a OneSource root GraphQL query — arguments, filters, return type. There are 12 root queries: address, addresses, block, blocks, contract, contracts, nft, nfts, token, tokens, transaction, transactions.', getQueryReferenceSchema.shape, (input) => handleGetQueryReference(input, schema));
92
+ instrumentedTool(server, analytics, transport, 'get_type_definition', 'Get the schema definition for a GraphQL type, enum, scalar, input, or interface. Returns fields, values, and descriptions.', getTypeDefinitionSchema.shape, (input) => handleGetTypeDefinition(input, schema));
93
+ instrumentedTool(server, analytics, transport, 'list_examples', 'List or search working GraphQL examples. Without a topic, returns a summary of all available examples. With a topic, returns full example content matching that keyword.', listExamplesSchema.shape, (input) => handleListExamples(input, sections));
94
+ instrumentedTool(server, analytics, transport, 'list_supported_chains', 'List all blockchain networks supported by OneSource with endpoint URLs.', listSupportedChainsSchema.shape, () => handleListSupportedChains());
95
+ instrumentedTool(server, analytics, transport, 'get_filter_reference', 'Get all filter fields and operators for a list query (e.g. transactions, tokens).', getFilterReferenceSchema.shape, (input) => handleGetFilterReference(input, schema));
96
+ instrumentedTool(server, analytics, transport, 'get_pagination_guide', 'Get the cursor-based pagination pattern with examples for a list query.', getPaginationGuideSchema.shape, (input) => handleGetPaginationGuide(input, schema));
97
+ instrumentedTool(server, analytics, transport, 'get_schema_overview', 'Get a high-level summary of the entire GraphQL schema — all queries, types, enums, and scalars.', getSchemaOverviewSchema.shape, () => handleGetSchemaOverview(schema));
98
+ instrumentedTool(server, analytics, transport, 'get_authentication_guide', 'Get the authentication guide — API key format, endpoints, headers, and common mistakes.', getAuthenticationGuideSchema.shape, () => handleGetAuthenticationGuide());
99
+ return 9;
100
+ }
101
+ export { loadData };
102
+ //# sourceMappingURL=register-docs-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register-docs-tools.js","sourceRoot":"","sources":["../src/register-docs-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const VERSION: string;
2
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,OAAO,EAAE,MAA2C,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { createRequire } from 'node:module';
2
+ const require = createRequire(import.meta.url);
3
+ export const VERSION = require('../package.json').version;
4
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,CAAC,MAAM,OAAO,GAAW,OAAO,CAAC,iBAAiB,CAAC,CAAC,OAAO,CAAC"}
package/package.json ADDED
@@ -0,0 +1,52 @@
1
+ {
2
+ "name": "@one-source/mcp",
3
+ "version": "1.0.0",
4
+ "type": "module",
5
+ "description": "Unified MCP server for OneSource — 43 tools for blockchain data and API documentation",
6
+ "bin": {
7
+ "onesource-mcp": "./dist/cli.js"
8
+ },
9
+ "main": "./dist/create-server.js",
10
+ "types": "./dist/create-server.d.ts",
11
+ "exports": {
12
+ ".": {
13
+ "types": "./dist/create-server.d.ts",
14
+ "default": "./dist/create-server.js"
15
+ }
16
+ },
17
+ "files": [
18
+ "dist/",
19
+ "README.md",
20
+ "LICENSE"
21
+ ],
22
+ "scripts": {
23
+ "build": "tsc",
24
+ "prepublishOnly": "npm run build"
25
+ },
26
+ "dependencies": {
27
+ "@one-source/api-mcp": "^1.1.0",
28
+ "@one-source/docs-mcp": "^2.3.0",
29
+ "@modelcontextprotocol/sdk": "^1.27.1",
30
+ "zod": "^3.24.0"
31
+ },
32
+ "devDependencies": {
33
+ "@types/node": "^22.0.0",
34
+ "typescript": "^5.7.0"
35
+ },
36
+ "engines": {
37
+ "node": ">=18"
38
+ },
39
+ "keywords": [
40
+ "mcp",
41
+ "model-context-protocol",
42
+ "onesource",
43
+ "web3",
44
+ "blockchain",
45
+ "graphql",
46
+ "documentation",
47
+ "x402"
48
+ ],
49
+ "author": "BlockParty",
50
+ "license": "UNLICENSED",
51
+ "homepage": "https://docs.onesource.io"
52
+ }