matimo 0.1.0-alpha.11 → 0.1.0-alpha.12.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.
Files changed (90) hide show
  1. package/README.md +29 -11
  2. package/package.json +6 -4
  3. package/packages/cli/dist/bin.d.ts +3 -0
  4. package/packages/cli/dist/bin.d.ts.map +1 -0
  5. package/packages/cli/dist/bin.js +50 -0
  6. package/packages/cli/dist/bin.js.map +1 -0
  7. package/packages/cli/dist/cli.d.ts.map +1 -1
  8. package/packages/cli/dist/cli.js +48 -2
  9. package/packages/cli/dist/cli.js.map +1 -1
  10. package/packages/cli/dist/commands/mcp-setup.d.ts +9 -0
  11. package/packages/cli/dist/commands/mcp-setup.d.ts.map +1 -0
  12. package/packages/cli/dist/commands/mcp-setup.js +106 -0
  13. package/packages/cli/dist/commands/mcp-setup.js.map +1 -0
  14. package/packages/cli/dist/commands/mcp.d.ts +16 -0
  15. package/packages/cli/dist/commands/mcp.d.ts.map +1 -0
  16. package/packages/cli/dist/commands/mcp.js +220 -0
  17. package/packages/cli/dist/commands/mcp.js.map +1 -0
  18. package/packages/core/dist/core/tool-loader.d.ts +3 -1
  19. package/packages/core/dist/core/tool-loader.d.ts.map +1 -1
  20. package/packages/core/dist/core/tool-loader.js +33 -10
  21. package/packages/core/dist/core/tool-loader.js.map +1 -1
  22. package/packages/core/dist/core/types.d.ts +37 -0
  23. package/packages/core/dist/core/types.d.ts.map +1 -1
  24. package/packages/core/dist/encodings/parameter-encoding.d.ts.map +1 -1
  25. package/packages/core/dist/encodings/parameter-encoding.js +6 -2
  26. package/packages/core/dist/encodings/parameter-encoding.js.map +1 -1
  27. package/packages/core/dist/executors/command-executor.d.ts +9 -2
  28. package/packages/core/dist/executors/command-executor.d.ts.map +1 -1
  29. package/packages/core/dist/executors/command-executor.js +14 -2
  30. package/packages/core/dist/executors/command-executor.js.map +1 -1
  31. package/packages/core/dist/executors/function-executor.d.ts +10 -3
  32. package/packages/core/dist/executors/function-executor.d.ts.map +1 -1
  33. package/packages/core/dist/executors/function-executor.js +11 -4
  34. package/packages/core/dist/executors/function-executor.js.map +1 -1
  35. package/packages/core/dist/executors/http-executor.d.ts +16 -2
  36. package/packages/core/dist/executors/http-executor.d.ts.map +1 -1
  37. package/packages/core/dist/executors/http-executor.js +22 -6
  38. package/packages/core/dist/executors/http-executor.js.map +1 -1
  39. package/packages/core/dist/index.d.ts +6 -1
  40. package/packages/core/dist/index.d.ts.map +1 -1
  41. package/packages/core/dist/index.js +5 -0
  42. package/packages/core/dist/index.js.map +1 -1
  43. package/packages/core/dist/integrations/langchain.d.ts.map +1 -1
  44. package/packages/core/dist/integrations/langchain.js +5 -4
  45. package/packages/core/dist/integrations/langchain.js.map +1 -1
  46. package/packages/core/dist/matimo-instance.d.ts +39 -12
  47. package/packages/core/dist/matimo-instance.d.ts.map +1 -1
  48. package/packages/core/dist/matimo-instance.js +101 -26
  49. package/packages/core/dist/matimo-instance.js.map +1 -1
  50. package/packages/core/dist/mcp/index.d.ts +18 -0
  51. package/packages/core/dist/mcp/index.d.ts.map +1 -0
  52. package/packages/core/dist/mcp/index.js +24 -0
  53. package/packages/core/dist/mcp/index.js.map +1 -0
  54. package/packages/core/dist/mcp/mcp-server.d.ts +110 -0
  55. package/packages/core/dist/mcp/mcp-server.d.ts.map +1 -0
  56. package/packages/core/dist/mcp/mcp-server.js +646 -0
  57. package/packages/core/dist/mcp/mcp-server.js.map +1 -0
  58. package/packages/core/dist/mcp/secrets/aws-resolver.d.ts +41 -0
  59. package/packages/core/dist/mcp/secrets/aws-resolver.d.ts.map +1 -0
  60. package/packages/core/dist/mcp/secrets/aws-resolver.js +141 -0
  61. package/packages/core/dist/mcp/secrets/aws-resolver.js.map +1 -0
  62. package/packages/core/dist/mcp/secrets/dotenv-resolver.d.ts +23 -0
  63. package/packages/core/dist/mcp/secrets/dotenv-resolver.d.ts.map +1 -0
  64. package/packages/core/dist/mcp/secrets/dotenv-resolver.js +94 -0
  65. package/packages/core/dist/mcp/secrets/dotenv-resolver.js.map +1 -0
  66. package/packages/core/dist/mcp/secrets/env-resolver.d.ts +14 -0
  67. package/packages/core/dist/mcp/secrets/env-resolver.d.ts.map +1 -0
  68. package/packages/core/dist/mcp/secrets/env-resolver.js +27 -0
  69. package/packages/core/dist/mcp/secrets/env-resolver.js.map +1 -0
  70. package/packages/core/dist/mcp/secrets/index.d.ts +14 -0
  71. package/packages/core/dist/mcp/secrets/index.d.ts.map +1 -0
  72. package/packages/core/dist/mcp/secrets/index.js +13 -0
  73. package/packages/core/dist/mcp/secrets/index.js.map +1 -0
  74. package/packages/core/dist/mcp/secrets/resolver-chain.d.ts +34 -0
  75. package/packages/core/dist/mcp/secrets/resolver-chain.d.ts.map +1 -0
  76. package/packages/core/dist/mcp/secrets/resolver-chain.js +141 -0
  77. package/packages/core/dist/mcp/secrets/resolver-chain.js.map +1 -0
  78. package/packages/core/dist/mcp/secrets/types.d.ts +73 -0
  79. package/packages/core/dist/mcp/secrets/types.d.ts.map +1 -0
  80. package/packages/core/dist/mcp/secrets/types.js +8 -0
  81. package/packages/core/dist/mcp/secrets/types.js.map +1 -0
  82. package/packages/core/dist/mcp/secrets/vault-resolver.d.ts +43 -0
  83. package/packages/core/dist/mcp/secrets/vault-resolver.d.ts.map +1 -0
  84. package/packages/core/dist/mcp/secrets/vault-resolver.js +127 -0
  85. package/packages/core/dist/mcp/secrets/vault-resolver.js.map +1 -0
  86. package/packages/core/dist/mcp/tool-converter.d.ts +40 -0
  87. package/packages/core/dist/mcp/tool-converter.d.ts.map +1 -0
  88. package/packages/core/dist/mcp/tool-converter.js +176 -0
  89. package/packages/core/dist/mcp/tool-converter.js.map +1 -0
  90. package/packages/cli/bin/matimo.cjs +0 -26
package/README.md CHANGED
@@ -46,7 +46,7 @@ const matimo = await MatimoInstance.init({
46
46
  autoDiscover: true,
47
47
  });
48
48
 
49
- const result = await matimo.execute('slack-send-message', {
49
+ const result = await matimo.execute('slack_send_channel_message', {
50
50
  channel: '#general',
51
51
  text: 'Hello from Matimo!',
52
52
  });
@@ -59,13 +59,17 @@ See [Three Integration Patterns](#three-integration-patterns) and [examples/](./
59
59
  Matimo ships with built-in support for:
60
60
 
61
61
  - **Core Tools**: File I/O, Web fetch, Command execution, Code search
62
- - **Slack Integration**: Send messages, manage channels, read threads
63
- - **Gmail Integration**: Send/read email, manage threads
64
- - **GitHub Integration**: Issues, pull requests, releases
62
+ - **MCP Server**: Expose all tools via stdio or Streamable HTTP to Claude Desktop, Cursor, Windsurf, and any MCP client (`npx matimo mcp`)
63
+ - **Slack Integration**: Send messages, manage channels, reactions, threads, DMs
64
+ - **Gmail Integration**: Send/read email, manage threads, drafts
65
+ - **GitHub Integration**: Issues, pull requests, releases, code search
66
+ - **Notion Integration**: Pages, databases, blocks, search
67
+ - **HubSpot Tools**: Contacts, companies, deals, tickets
65
68
  - **Postgres Tools**: Query/modify data with safety checks
66
- - **HubSpot Tools**: Read/Write data to Hubspot CRM
67
- - **Auto-Discovery**: Automatic detection of @matimo/\* providers from npm
68
- - **Matimo CLI**: Tool discovery, installation, and management
69
+ - **Twilio Tools**: Send SMS/MMS, manage messages
70
+ - **Mailchimp Tools**: Audiences, subscribers, email campaigns
71
+ - **Auto-Discovery**: Automatic detection of `@matimo/*` providers from npm
72
+ - **Matimo CLI**: Tool discovery, setup wizard, MCP config generation
69
73
  - **OAuth2 Support**: Provider-agnostic authorization for Slack, Gmail, GitHub, etc.
70
74
  - **Framework Support**: Factory pattern, Decorator pattern, LangChain, CrewAI
71
75
  - **TypeScript SDK**: Full type safety and IDE support
@@ -98,7 +102,7 @@ const result = await matimo.execute('calculator', { operation: 'add', a: 5, b: 3
98
102
  ### 2️⃣ Decorator Pattern (Class-Based)
99
103
 
100
104
  ```typescript
101
- @tool('slack-send-message')
105
+ @tool('slack_send_channel_message')
102
106
  async sendMessage(channel: string, text: string) { /* Auto-executed */ }
103
107
  ```
104
108
 
@@ -111,7 +115,22 @@ const tools = matimo.listTools().map(tool => ({
111
115
  }));
112
116
  ```
113
117
 
114
- See [SDK Usage Patterns](./docs/user-guide/SDK_PATTERNS.md) and [LangChain Integration](./docs/framework-integrations/LANGCHAIN.md) for details.
118
+ ### 4️⃣ MCP Server (Claude Desktop, Cursor, Windsurf, any MCP client)
119
+
120
+ ```bash
121
+ # Expose all installed @matimo/* tools via MCP in one command
122
+ npx matimo mcp
123
+
124
+ # Run the setup wizard to get a ready-to-paste client config
125
+ npx matimo mcp setup
126
+
127
+ # HTTP mode for remote access / Docker
128
+ npx matimo mcp --transport http --port 3000 --self-signed
129
+ ```
130
+
131
+ See [MCP Docs](./docs/MCP.md) for the full reference.
132
+
133
+ See [SDK Usage Patterns](./docs/user-guide/SDK_PATTERNS.md), [LangChain Integration](./docs/framework-integrations/LANGCHAIN.md), and [MCP Server](./docs/MCP.md) for details.
115
134
 
116
135
  ---
117
136
 
@@ -157,10 +176,9 @@ cd examples/tools && pnpm install && pnpm agent:factory
157
176
 
158
177
  ## Features **Coming Soon:**
159
178
 
160
- - More tool providers (Stripe, Twilio, Notion, etc.)
179
+ - More tool providers (Stripe, Jira, Linear, etc.)
161
180
  - Python SDK
162
181
  - Custom Tool Marketplace
163
- - MCP Server support
164
182
 
165
183
  ---
166
184
 
package/package.json CHANGED
@@ -1,9 +1,12 @@
1
1
  {
2
2
  "name": "matimo",
3
- "version": "0.1.0-alpha.11",
3
+ "version": "0.1.0-alpha.12.1",
4
4
  "description": "Universal tool provider SDK: Framework-agnostic YAML-driven tool ecosystem for AI agents. Execute a library of pre-built tools (Slack, Gmail, GitHub, AWS, etc.) or define your own in YAML.",
5
5
  "main": "packages/core/dist/index.js",
6
6
  "types": "packages/core/dist/index.d.ts",
7
+ "bin": {
8
+ "matimo": "packages/cli/dist/bin.js"
9
+ },
7
10
  "type": "module",
8
11
  "packageManager": "pnpm@8.15.0",
9
12
  "private": false,
@@ -47,7 +50,6 @@
47
50
  "files": [
48
51
  "packages/core/dist",
49
52
  "packages/cli/dist",
50
- "packages/cli/bin",
51
53
  "README.md",
52
54
  "LICENSE"
53
55
  ],
@@ -55,8 +57,8 @@
55
57
  "access": "public"
56
58
  },
57
59
  "dependencies": {
58
- "@matimo/cli": "0.1.0-alpha.11",
59
- "@matimo/core": "0.1.0-alpha.11"
60
+ "@matimo/cli": "0.1.0-alpha.12.1",
61
+ "@matimo/core": "0.1.0-alpha.12.1"
60
62
  },
61
63
  "devDependencies": {
62
64
  "@commitlint/cli": "^20.3.1",
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=bin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bin.d.ts","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":""}
@@ -0,0 +1,50 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Matimo CLI entry point
4
+ *
5
+ * This is the npm bin target — compiled to dist/bin.js.
6
+ * All command routing (install, list, search, mcp, etc.) is handled by cli.ts.
7
+ *
8
+ * Uses tsx to register ESM hooks so extensionless imports in @matimo/core work
9
+ * correctly. This is required because @matimo/core compiles TypeScript with
10
+ * "moduleResolution": "bundler" which omits .js extensions in the output.
11
+ *
12
+ * Tool discovery works automatically via ToolLoader.getNodeModulesPath():
13
+ * 1. Walks up from process.cwd() to find node_modules/@matimo/*
14
+ * 2. Falls back to __dirname-based discovery (for Claude Desktop where cwd='/')
15
+ *
16
+ * Users run:
17
+ * npx matimo mcp # stdio mode
18
+ * npx matimo mcp --transport http # http mode
19
+ * npx matimo install slack gmail # install providers
20
+ * npx matimo list # list installed tools
21
+ */
22
+ import { spawn } from 'child_process';
23
+ import { dirname, join } from 'path';
24
+ import { fileURLToPath } from 'url';
25
+ import { createRequire } from 'module';
26
+ const __filename = fileURLToPath(import.meta.url);
27
+ const __dirname = dirname(__filename);
28
+ // Resolve tsx from this package's dependencies
29
+ const require = createRequire(import.meta.url);
30
+ let tsxBin;
31
+ try {
32
+ const tsxPkgPath = require.resolve('tsx/package.json');
33
+ tsxBin = join(dirname(tsxPkgPath), 'dist', 'cli.mjs');
34
+ }
35
+ catch {
36
+ tsxBin = 'tsx';
37
+ }
38
+ const cliScript = join(__dirname, 'cli.js');
39
+ const child = spawn(process.execPath, [tsxBin, cliScript, ...process.argv.slice(2)], {
40
+ stdio: 'inherit',
41
+ env: process.env,
42
+ });
43
+ child.on('error', (error) => {
44
+ console.error('❌ Failed to start Matimo CLI. Make sure tsx is installed.');
45
+ console.error(' Run: npm install tsx');
46
+ console.error(' Error:', error.message);
47
+ process.exit(1);
48
+ });
49
+ child.on('exit', (code) => process.exit(code || 0));
50
+ //# sourceMappingURL=bin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAEvC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC,+CAA+C;AAC/C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,IAAI,MAAc,CAAC;AACnB,IAAI,CAAC;IACH,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACvD,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;AACxD,CAAC;AAAC,MAAM,CAAC;IACP,MAAM,GAAG,KAAK,CAAC;AACjB,CAAC;AAED,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AAC5C,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE;IACnF,KAAK,EAAE,SAAS;IAChB,GAAG,EAAE,OAAO,CAAC,GAAG;CACjB,CAAC,CAAC;AAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAY,EAAE,EAAE;IACjC,OAAO,CAAC,KAAK,CAAC,2DAA2D,CAAC,CAAC;IAC3E,OAAO,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;IACzC,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IAC1C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEH,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAmB,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAgBA,wBAAgB,QAAQ,IAAI,IAAI,CAmC/B;AAED;;GAEG;AACH,wBAAsB,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAwC5D"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAiBA,wBAAgB,QAAQ,IAAI,IAAI,CA2D/B;AAED;;GAEG;AACH,wBAAsB,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA2C5D"}
@@ -1,8 +1,9 @@
1
1
  import { readFileSync } from 'fs';
2
- import { join } from 'path';
2
+ import { join, basename } from 'path';
3
3
  import { installCommand } from './commands/install.js';
4
4
  import { listCommand } from './commands/list.js';
5
5
  import { searchCommand } from './commands/search.js';
6
+ import { mcpCommand } from './commands/mcp.js';
6
7
  function getPackageVersion() {
7
8
  try {
8
9
  const pkgPath = join(process.cwd(), 'package.json');
@@ -29,10 +30,26 @@ Commands:
29
30
  search <query> Search for available tools
30
31
  Example: matimo search slack
31
32
 
33
+ mcp Start MCP server (Model Context Protocol)
34
+ Example: matimo mcp
35
+ Example: matimo mcp --transport http --port 3000
36
+
37
+ mcp setup Generate config for Claude Desktop / Cursor
38
+ Example: matimo mcp setup
39
+
32
40
  help Show this help message
33
41
 
34
42
  version Show version information
35
43
 
44
+ MCP Options:
45
+ --transport <type> Transport mode: stdio (default) or http
46
+ --port <number> HTTP port (default: 3000)
47
+ --tools <list> Comma-separated tool allowlist
48
+ --exclude <list> Comma-separated tool denylist
49
+ --secrets <list> Secret resolvers: env,dotenv,vault,aws
50
+ --token <string> Bearer token for HTTP mode
51
+ --env-file <path> Path to .env file
52
+
36
53
  Examples:
37
54
  # Install new tools
38
55
  $ matimo install slack
@@ -43,7 +60,15 @@ Examples:
43
60
 
44
61
  # Search for tools
45
62
  $ matimo search email
46
- $ matimo search database
63
+
64
+ # Start MCP server for Claude Desktop
65
+ $ matimo mcp
66
+
67
+ # Start MCP HTTP server with auth
68
+ $ MATIMO_MCP_TOKEN=secret matimo mcp --transport http
69
+
70
+ # Generate Claude Desktop config
71
+ $ matimo mcp setup
47
72
 
48
73
  Documentation: https://github.com/tallclub/matimo#readme
49
74
  Issues: https://github.com/tallclub/matimo/issues
@@ -71,6 +96,9 @@ export async function main(cliArgs) {
71
96
  case 'search':
72
97
  await searchCommand(params[0] || '');
73
98
  break;
99
+ case 'mcp':
100
+ await mcpCommand(params);
101
+ break;
74
102
  case 'help':
75
103
  case '-h':
76
104
  case '--help':
@@ -92,4 +120,22 @@ export async function main(cliArgs) {
92
120
  process.exit(1);
93
121
  }
94
122
  }
123
+ // Auto-execute when run directly (e.g., via tsx src/cli.ts or through bin.ts).
124
+ // bin.ts spawns: node <tsx-cli.mjs> <cli.js> ...args
125
+ // - When tsx shifts its own entry out of argv: process.argv[1] == cli.js
126
+ // - When tsx does NOT shift argv: process.argv[2] == cli.js
127
+ // Checking both slots handles either tsx version. When imported as a module
128
+ // (tests, bin.ts import) neither slot contains 'cli.js'.
129
+ // Use basename() to normalise path separators (POSIX / and Windows \).
130
+ /* istanbul ignore next */
131
+ const toCliJs = (s) => basename(s).replace(/\.ts$/, '.js');
132
+ /* istanbul ignore next */
133
+ const isRunDirectly = toCliJs(process.argv[1] ?? '') === 'cli.js' || toCliJs(process.argv[2] ?? '') === 'cli.js';
134
+ /* istanbul ignore next */
135
+ if (isRunDirectly) {
136
+ main().catch((error) => {
137
+ console.error('❌ Fatal error:', error);
138
+ process.exit(1);
139
+ });
140
+ }
95
141
  //# sourceMappingURL=cli.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,SAAS,iBAAiB;IACxB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,CAAC;QACpD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;QACtD,OAAO,GAAG,CAAC,OAAO,CAAC;IACrB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,QAAQ;IACtB,OAAO,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiCd,CAAC,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,OAAkB;IAC3C,MAAM,IAAI,GAAG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACxB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAE7B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,QAAQ,EAAE,CAAC;QACX,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC;QACH,QAAQ,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;YAC9B,KAAK,SAAS;gBACZ,MAAM,cAAc,CAAC,MAAM,CAAC,CAAC;gBAC7B,MAAM;YACR,KAAK,MAAM;gBACT,MAAM,WAAW,EAAE,CAAC;gBACpB,MAAM;YACR,KAAK,QAAQ;gBACX,MAAM,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;gBACrC,MAAM;YACR,KAAK,MAAM,CAAC;YACZ,KAAK,IAAI,CAAC;YACV,KAAK,QAAQ;gBACX,QAAQ,EAAE,CAAC;gBACX,MAAM;YACR,KAAK,SAAS,CAAC;YACf,KAAK,IAAI,CAAC;YACV,KAAK,WAAW;gBACd,OAAO,CAAC,IAAI,CAAC,eAAe,iBAAiB,EAAE,EAAE,CAAC,CAAC;gBACnD,MAAM;YACR;gBACE,OAAO,CAAC,KAAK,CAAC,sBAAsB,OAAO,EAAE,CAAC,CAAC;gBAC/C,OAAO,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;gBAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAClF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * CLI command: matimo mcp setup
3
+ *
4
+ * Interactive config generator for MCP server.
5
+ * Detects installed tools, scans for required auth env vars,
6
+ * and outputs a ready-to-paste Claude Desktop / Cursor config.
7
+ */
8
+ export declare function mcpSetupCommand(): Promise<void>;
9
+ //# sourceMappingURL=mcp-setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-setup.d.ts","sourceRoot":"","sources":["../../src/commands/mcp-setup.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAiHrD"}
@@ -0,0 +1,106 @@
1
+ /**
2
+ * CLI command: matimo mcp setup
3
+ *
4
+ * Interactive config generator for MCP server.
5
+ * Detects installed tools, scans for required auth env vars,
6
+ * and outputs a ready-to-paste Claude Desktop / Cursor config.
7
+ */
8
+ export async function mcpSetupCommand() {
9
+ console.info('\n🔨 Matimo MCP Setup\n');
10
+ console.info('Scanning for installed tool packages...\n');
11
+ try {
12
+ // @ts-ignore - dynamic import of package resolved at runtime
13
+ const { ToolLoader, extractAuthPlaceholders } = await import('@matimo/core');
14
+ const loader = new ToolLoader();
15
+ // Auto-discover installed packages
16
+ const toolPaths = loader.autoDiscoverPackages();
17
+ if (toolPaths.length === 0) {
18
+ console.info('No @matimo/* tool packages found.');
19
+ console.info('Install tools first: matimo install slack github\n');
20
+ return;
21
+ }
22
+ // Load all tools
23
+ const tools = loader.loadToolsFromMultiplePaths(toolPaths);
24
+ console.info(`Found ${tools.size} tools across ${toolPaths.length} package(s):\n`);
25
+ // Group tools by provider (extract from tool name prefix)
26
+ const providers = new Map();
27
+ const authVars = new Set();
28
+ for (const [name, tool] of tools) {
29
+ // Extract provider from tool name (e.g., "slack_send" → "slack")
30
+ const provider = name.includes('_')
31
+ ? name.split('_')[0]
32
+ : name.includes('-')
33
+ ? name.split('-')[0]
34
+ : 'core';
35
+ if (!providers.has(provider)) {
36
+ providers.set(provider, []);
37
+ }
38
+ providers.get(provider).push(name);
39
+ // Extract auth placeholders
40
+ const placeholders = extractAuthPlaceholders(tool);
41
+ for (const p of placeholders) {
42
+ authVars.add(p);
43
+ }
44
+ }
45
+ // Display providers and tools
46
+ for (const [provider, toolNames] of providers) {
47
+ console.info(` 📦 ${provider} (${toolNames.length} tools)`);
48
+ for (const name of toolNames.slice(0, 5)) {
49
+ console.info(` • ${name}`);
50
+ }
51
+ if (toolNames.length > 5) {
52
+ console.info(` ... and ${toolNames.length - 5} more`);
53
+ }
54
+ }
55
+ console.info('');
56
+ // Display required env vars
57
+ if (authVars.size > 0) {
58
+ console.info('🔐 Required environment variables:\n');
59
+ for (const v of authVars) {
60
+ const value = process.env[v] || process.env[`MATIMO_${v}`];
61
+ const status = value ? '✅' : '❌';
62
+ console.info(` ${status} ${v}`);
63
+ }
64
+ console.info('');
65
+ }
66
+ // Generate Claude Desktop config
67
+ const envBlock = {};
68
+ for (const v of authVars) {
69
+ envBlock[v] = process.env[v] || process.env[`MATIMO_${v}`] || '<your-token>';
70
+ }
71
+ const claudeConfig = {
72
+ mcpServers: {
73
+ matimo: {
74
+ command: 'npx',
75
+ args: ['matimo', 'mcp'],
76
+ env: envBlock,
77
+ },
78
+ },
79
+ };
80
+ console.info('📋 Claude Desktop config (paste into Settings → Developer → MCP Servers):\n');
81
+ console.info(JSON.stringify(claudeConfig, null, 2));
82
+ // Generate Cursor config
83
+ console.info('\n📋 Cursor config (paste into .cursor/mcp.json):\n');
84
+ const cursorConfig = {
85
+ mcpServers: {
86
+ matimo: {
87
+ command: 'npx',
88
+ args: ['matimo', 'mcp'],
89
+ env: envBlock,
90
+ },
91
+ },
92
+ };
93
+ console.info(JSON.stringify(cursorConfig, null, 2));
94
+ // HTTP mode example
95
+ console.info('\n📋 HTTP mode (for remote hosting / Docker):\n');
96
+ const envExport = [...authVars].map((v) => ` ${v}=<your-token>`).join(' \\\n');
97
+ console.info(` ${envExport} \\`);
98
+ console.info(` MATIMO_MCP_TOKEN=<your-server-secret> \\`);
99
+ console.info(` npx matimo mcp --transport http --port 3000\n`);
100
+ }
101
+ catch (error) {
102
+ console.error('❌ Setup failed:', error instanceof Error ? error.message : String(error));
103
+ process.exit(1);
104
+ }
105
+ }
106
+ //# sourceMappingURL=mcp-setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-setup.js","sourceRoot":"","sources":["../../src/commands/mcp-setup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * CLI command: matimo mcp
3
+ *
4
+ * Starts the Matimo MCP server with configurable transport and options.
5
+ *
6
+ * Usage:
7
+ * matimo mcp # stdio mode (default)
8
+ * matimo mcp --transport http --port 3000 # HTTP mode
9
+ * matimo mcp --tools slack,github # only these tools
10
+ * matimo mcp --exclude postgres # exclude these tools
11
+ * matimo mcp --secrets env,vault # secret resolver chain
12
+ * matimo mcp --token my-secret # HTTP bearer token
13
+ * matimo mcp --tool-paths /path/to/tools # custom tool paths
14
+ */
15
+ export declare function mcpCommand(params: string[]): Promise<void>;
16
+ //# sourceMappingURL=mcp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../src/commands/mcp.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAsKH,wBAAsB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA6FhE"}
@@ -0,0 +1,220 @@
1
+ /**
2
+ * CLI command: matimo mcp
3
+ *
4
+ * Starts the Matimo MCP server with configurable transport and options.
5
+ *
6
+ * Usage:
7
+ * matimo mcp # stdio mode (default)
8
+ * matimo mcp --transport http --port 3000 # HTTP mode
9
+ * matimo mcp --tools slack,github # only these tools
10
+ * matimo mcp --exclude postgres # exclude these tools
11
+ * matimo mcp --secrets env,vault # secret resolver chain
12
+ * matimo mcp --token my-secret # HTTP bearer token
13
+ * matimo mcp --tool-paths /path/to/tools # custom tool paths
14
+ */
15
+ function parseArgs(params) {
16
+ const args = {
17
+ transport: 'stdio',
18
+ port: 3000,
19
+ };
20
+ /** Assert that a value-consuming flag was given an argument, not another flag or end-of-input. */
21
+ const requireValue = (flag, value) => {
22
+ if (!value || value.startsWith('-')) {
23
+ console.error(`❌ ${flag} requires a value`);
24
+ process.exit(1);
25
+ }
26
+ return value;
27
+ };
28
+ for (let i = 0; i < params.length; i++) {
29
+ const flag = params[i];
30
+ const next = params[i + 1];
31
+ switch (flag) {
32
+ case '--transport':
33
+ case '-t':
34
+ if (next === 'stdio' || next === 'http') {
35
+ args.transport = next;
36
+ i++;
37
+ }
38
+ else {
39
+ console.error('❌ --transport must be "stdio" or "http"');
40
+ process.exit(1);
41
+ }
42
+ break;
43
+ case '--port':
44
+ case '-p':
45
+ args.port = parseInt(next, 10);
46
+ if (isNaN(args.port)) {
47
+ console.error('❌ --port must be a number');
48
+ process.exit(1);
49
+ }
50
+ i++;
51
+ break;
52
+ case '--tools':
53
+ args.tools = requireValue('--tools', next)
54
+ .split(',')
55
+ .map((s) => s.trim());
56
+ i++;
57
+ break;
58
+ case '--exclude':
59
+ args.excludeTools = requireValue('--exclude', next)
60
+ .split(',')
61
+ .map((s) => s.trim());
62
+ i++;
63
+ break;
64
+ case '--secrets':
65
+ args.secrets = requireValue('--secrets', next)
66
+ .split(',')
67
+ .map((s) => s.trim());
68
+ i++;
69
+ break;
70
+ case '--env-file':
71
+ args.envFile = requireValue('--env-file', next);
72
+ i++;
73
+ break;
74
+ case '--vault-path':
75
+ args.vaultPath = requireValue('--vault-path', next);
76
+ i++;
77
+ break;
78
+ case '--aws-secret-id':
79
+ args.awsSecretId = requireValue('--aws-secret-id', next);
80
+ i++;
81
+ break;
82
+ case '--token':
83
+ args.token = requireValue('--token', next);
84
+ i++;
85
+ break;
86
+ case '--tool-paths':
87
+ args.toolPaths = requireValue('--tool-paths', next)
88
+ .split(',')
89
+ .map((s) => s.trim());
90
+ i++;
91
+ break;
92
+ case '--https':
93
+ args.https = true;
94
+ break;
95
+ case '--self-signed':
96
+ args.https = true;
97
+ args.selfSigned = true;
98
+ break;
99
+ case '--cert':
100
+ args.certPath = requireValue('--cert', next);
101
+ args.https = true;
102
+ i++;
103
+ break;
104
+ case '--key':
105
+ args.keyPath = requireValue('--key', next);
106
+ args.https = true;
107
+ i++;
108
+ break;
109
+ case 'setup':
110
+ // Handled separately in cli.ts
111
+ break;
112
+ default:
113
+ if (flag.startsWith('-')) {
114
+ console.error(`❌ Unknown flag: ${flag}`);
115
+ process.exit(1);
116
+ }
117
+ }
118
+ }
119
+ return args;
120
+ }
121
+ function buildResolverConfig(args) {
122
+ const secretTypes = args.secrets ?? ['env', 'dotenv'];
123
+ const resolvers = secretTypes.map((type) => {
124
+ switch (type) {
125
+ case 'env':
126
+ return { type: 'env' };
127
+ case 'dotenv':
128
+ return { type: 'dotenv', path: args.envFile };
129
+ case 'vault':
130
+ return { type: 'vault', secretPath: args.vaultPath };
131
+ case 'aws':
132
+ return { type: 'aws', secretId: args.awsSecretId };
133
+ default:
134
+ console.error(`❌ Unknown secret resolver: ${type}. Use: env, dotenv, vault, aws`);
135
+ process.exit(1);
136
+ }
137
+ });
138
+ return { resolvers };
139
+ }
140
+ export async function mcpCommand(params) {
141
+ // Check for 'setup' subcommand
142
+ if (params[0] === 'setup') {
143
+ const { mcpSetupCommand } = await import('./mcp-setup.js');
144
+ await mcpSetupCommand();
145
+ return;
146
+ }
147
+ const args = parseArgs(params);
148
+ // Lazy-import core MCP server
149
+ // @ts-ignore - dynamic import of package resolved at runtime
150
+ const { MCPServer } = await import('@matimo/core');
151
+ const server = new MCPServer({
152
+ transport: args.transport,
153
+ port: args.port,
154
+ tools: args.tools,
155
+ excludeTools: args.excludeTools,
156
+ secretResolver: buildResolverConfig(args),
157
+ mcpToken: args.token,
158
+ toolPaths: args.toolPaths,
159
+ autoDiscover: true,
160
+ https: args.https,
161
+ selfSigned: args.selfSigned,
162
+ certPath: args.certPath,
163
+ keyPath: args.keyPath,
164
+ });
165
+ // Graceful shutdown
166
+ const shutdown = async () => {
167
+ // Only log to stderr in stdio mode (stdout is JSON-RPC)
168
+ if (args.transport === 'stdio') {
169
+ process.stderr.write('\nShutting down Matimo MCP server...\n');
170
+ }
171
+ else {
172
+ console.info('\nShutting down Matimo MCP server...');
173
+ }
174
+ await server.stop();
175
+ process.exit(0);
176
+ };
177
+ process.on('SIGINT', shutdown);
178
+ process.on('SIGTERM', shutdown);
179
+ try {
180
+ await server.start();
181
+ if (args.transport === 'http') {
182
+ const protocol = args.https ? 'https' : 'http';
183
+ const url = `${protocol}://localhost:${args.port}/mcp`;
184
+ const token = server.getActiveToken();
185
+ console.info('');
186
+ console.info(`🚀 Matimo MCP server running at ${url}`);
187
+ if (args.https) {
188
+ if (args.selfSigned || (!args.certPath && !args.keyPath)) {
189
+ console.info('🔒 HTTPS enabled (self-signed certificate)');
190
+ console.info(' ⚠️ Clients may need to disable cert verification for self-signed certs');
191
+ }
192
+ else {
193
+ console.info('🔒 HTTPS enabled');
194
+ }
195
+ }
196
+ if (token) {
197
+ const isAutoGenerated = !args.token && !process.env.MATIMO_MCP_TOKEN;
198
+ console.info('');
199
+ console.info(`🔐 Bearer Token${isAutoGenerated ? ' (auto-generated)' : ''}:`);
200
+ console.info(` ${token}`);
201
+ console.info('');
202
+ console.info(' Connect your MCP client:');
203
+ console.info(` url: ${url}`);
204
+ console.info(` Authorization: Bearer ${token}`);
205
+ if (isAutoGenerated) {
206
+ console.info('');
207
+ console.info(' To use a fixed token, set MATIMO_MCP_TOKEN or use --token <value>');
208
+ }
209
+ }
210
+ console.info('');
211
+ console.info(' Press Ctrl+C to stop');
212
+ console.info('');
213
+ }
214
+ }
215
+ catch (error) {
216
+ console.error('❌ Failed to start MCP server:', error instanceof Error ? error.message : String(error));
217
+ process.exit(1);
218
+ }
219
+ }
220
+ //# sourceMappingURL=mcp.js.map