mcp-http-webhook 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.
Files changed (80) hide show
  1. package/.eslintrc.json +16 -0
  2. package/.prettierrc.json +8 -0
  3. package/ARCHITECTURE.md +269 -0
  4. package/CONTRIBUTING.md +136 -0
  5. package/GETTING_STARTED.md +310 -0
  6. package/IMPLEMENTATION.md +294 -0
  7. package/LICENSE +21 -0
  8. package/MIGRATION_TO_SDK.md +263 -0
  9. package/README.md +496 -0
  10. package/SDK_INTEGRATION_COMPLETE.md +300 -0
  11. package/STANDARD_SUBSCRIPTIONS.md +268 -0
  12. package/STANDARD_SUBSCRIPTIONS_COMPLETE.md +309 -0
  13. package/SUMMARY.md +272 -0
  14. package/Spec.md +2778 -0
  15. package/dist/errors/index.d.ts +52 -0
  16. package/dist/errors/index.d.ts.map +1 -0
  17. package/dist/errors/index.js +81 -0
  18. package/dist/errors/index.js.map +1 -0
  19. package/dist/index.d.ts +9 -0
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +37 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/protocol/ProtocolHandler.d.ts +37 -0
  24. package/dist/protocol/ProtocolHandler.d.ts.map +1 -0
  25. package/dist/protocol/ProtocolHandler.js +172 -0
  26. package/dist/protocol/ProtocolHandler.js.map +1 -0
  27. package/dist/server.d.ts +6 -0
  28. package/dist/server.d.ts.map +1 -0
  29. package/dist/server.js +502 -0
  30. package/dist/server.js.map +1 -0
  31. package/dist/stores/InMemoryStore.d.ts +27 -0
  32. package/dist/stores/InMemoryStore.d.ts.map +1 -0
  33. package/dist/stores/InMemoryStore.js +73 -0
  34. package/dist/stores/InMemoryStore.js.map +1 -0
  35. package/dist/stores/RedisStore.d.ts +18 -0
  36. package/dist/stores/RedisStore.d.ts.map +1 -0
  37. package/dist/stores/RedisStore.js +45 -0
  38. package/dist/stores/RedisStore.js.map +1 -0
  39. package/dist/stores/index.d.ts +3 -0
  40. package/dist/stores/index.d.ts.map +1 -0
  41. package/dist/stores/index.js +9 -0
  42. package/dist/stores/index.js.map +1 -0
  43. package/dist/subscriptions/SubscriptionManager.d.ts +49 -0
  44. package/dist/subscriptions/SubscriptionManager.d.ts.map +1 -0
  45. package/dist/subscriptions/SubscriptionManager.js +181 -0
  46. package/dist/subscriptions/SubscriptionManager.js.map +1 -0
  47. package/dist/types/index.d.ts +271 -0
  48. package/dist/types/index.d.ts.map +1 -0
  49. package/dist/types/index.js +16 -0
  50. package/dist/types/index.js.map +1 -0
  51. package/dist/utils/index.d.ts +51 -0
  52. package/dist/utils/index.d.ts.map +1 -0
  53. package/dist/utils/index.js +154 -0
  54. package/dist/utils/index.js.map +1 -0
  55. package/dist/webhooks/WebhookManager.d.ts +27 -0
  56. package/dist/webhooks/WebhookManager.d.ts.map +1 -0
  57. package/dist/webhooks/WebhookManager.js +174 -0
  58. package/dist/webhooks/WebhookManager.js.map +1 -0
  59. package/examples/GITHUB_LIVE_EXAMPLE.md +308 -0
  60. package/examples/GITHUB_LIVE_SETUP.md +253 -0
  61. package/examples/QUICKSTART.md +130 -0
  62. package/examples/basic-setup.ts +142 -0
  63. package/examples/github-server-live.ts +690 -0
  64. package/examples/github-server.ts +223 -0
  65. package/examples/google-drive-server-live.ts +773 -0
  66. package/examples/start-github-live.sh +53 -0
  67. package/jest.config.js +20 -0
  68. package/package.json +58 -0
  69. package/src/errors/index.ts +81 -0
  70. package/src/index.ts +19 -0
  71. package/src/server.ts +595 -0
  72. package/src/stores/InMemoryStore.ts +87 -0
  73. package/src/stores/RedisStore.ts +51 -0
  74. package/src/stores/index.ts +2 -0
  75. package/src/subscriptions/SubscriptionManager.ts +240 -0
  76. package/src/types/index.ts +341 -0
  77. package/src/utils/index.ts +156 -0
  78. package/src/webhooks/WebhookManager.ts +230 -0
  79. package/test-sdk-integration.sh +157 -0
  80. package/tsconfig.json +21 -0
@@ -0,0 +1,142 @@
1
+ import { createMCPServer } from '../src';
2
+ import { InMemoryStore } from '../src/stores';
3
+
4
+ /**
5
+ * Basic MCP Server Example
6
+ *
7
+ * This example demonstrates how to create a simple MCP server
8
+ * using the official @modelcontextprotocol/sdk under the hood.
9
+ *
10
+ * The server will:
11
+ * - Listen on POST /mcp (standard MCP endpoint)
12
+ * - Support all standard MCP clients (Inspector, Claude, etc.)
13
+ * - Provide webhook subscription extensions
14
+ *
15
+ * Test with:
16
+ * - npx @modelcontextprotocol/inspector http://localhost:3000/mcp
17
+ * - curl -X POST http://localhost:3000/mcp -H "Content-Type: application/json" \
18
+ * -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
19
+ */
20
+
21
+ const store = new InMemoryStore();
22
+
23
+ const server = createMCPServer({
24
+ name: 'example-server',
25
+ version: '1.0.0',
26
+ publicUrl: process.env.PUBLIC_URL || 'http://localhost:3000',
27
+ port: 3000,
28
+ store,
29
+
30
+ // Simple tools
31
+ tools: [
32
+ {
33
+ name: 'echo',
34
+ description: 'Echo back the input message',
35
+ inputSchema: {
36
+ type: 'object',
37
+ properties: {
38
+ message: {
39
+ type: 'string',
40
+ description: 'Message to echo',
41
+ },
42
+ },
43
+ required: ['message'],
44
+ },
45
+ handler: async (input) => {
46
+ return {
47
+ echo: input.message,
48
+ timestamp: new Date().toISOString(),
49
+ };
50
+ },
51
+ },
52
+ {
53
+ name: 'add',
54
+ description: 'Add two numbers',
55
+ inputSchema: {
56
+ type: 'object',
57
+ properties: {
58
+ a: { type: 'number', description: 'First number' },
59
+ b: { type: 'number', description: 'Second number' },
60
+ },
61
+ required: ['a', 'b'],
62
+ },
63
+ handler: async (input) => {
64
+ return {
65
+ result: input.a + input.b,
66
+ };
67
+ },
68
+ },
69
+ ],
70
+
71
+ // Simple resources
72
+ resources: [
73
+ {
74
+ uri: 'example://greeting/{name}',
75
+ name: 'Greeting Resource',
76
+ description: 'Returns a personalized greeting',
77
+ mimeType: 'text/plain',
78
+
79
+ read: async (uri) => {
80
+ console.log('Reading resource:', uri);
81
+ const parts = uri.split('/');
82
+ const name = parts[parts.length - 1];
83
+ return {
84
+ contents: `Hello, ${name}!`,
85
+ };
86
+ },
87
+
88
+ list: async () => {
89
+ return [
90
+ {
91
+ uri: 'example://greeting/world',
92
+ name: 'World Greeting',
93
+ description: 'Greeting for the world',
94
+ },
95
+ {
96
+ uri: 'example://greeting/alice',
97
+ name: 'Alice Greeting',
98
+ description: 'Greeting for Alice',
99
+ },
100
+ ];
101
+ },
102
+ },
103
+ ],
104
+
105
+ // Optional: Simple authentication
106
+ authenticate: async (req) => {
107
+ // const apiKey = req.headers['x-api-key'];
108
+ // if (!apiKey) {
109
+ // throw new Error('API key required');
110
+ // }
111
+
112
+ // In production, validate against database
113
+ return {
114
+ userId: 'user-123',
115
+ apiKey: 'apiKey' as string,
116
+ };
117
+ },
118
+
119
+ logLevel: 'info',
120
+ });
121
+
122
+ // Start server
123
+ server.start().then(() => {
124
+ console.log('Server running!');
125
+ console.log('Try these requests:');
126
+ console.log('');
127
+ console.log('POST http://localhost:3000/mcp/tools/list');
128
+ console.log('POST http://localhost:3000/mcp/tools/call');
129
+ console.log(' Body: { "method": "tools/call", "params": { "name": "echo", "arguments": { "message": "Hello" } } }');
130
+ console.log('');
131
+ console.log('POST http://localhost:3000/mcp/resources/list');
132
+ console.log('POST http://localhost:3000/mcp/resources/read');
133
+ console.log(' Body: { "method": "resources/read", "params": { "uri": "example://greeting/world" } }');
134
+ });
135
+
136
+ // Graceful shutdown
137
+ process.on('SIGTERM', async () => {
138
+ console.log('Shutting down...');
139
+ await server.stop();
140
+ store.destroy();
141
+ process.exit(0);
142
+ });