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.
- package/.eslintrc.json +16 -0
- package/.prettierrc.json +8 -0
- package/ARCHITECTURE.md +269 -0
- package/CONTRIBUTING.md +136 -0
- package/GETTING_STARTED.md +310 -0
- package/IMPLEMENTATION.md +294 -0
- package/LICENSE +21 -0
- package/MIGRATION_TO_SDK.md +263 -0
- package/README.md +496 -0
- package/SDK_INTEGRATION_COMPLETE.md +300 -0
- package/STANDARD_SUBSCRIPTIONS.md +268 -0
- package/STANDARD_SUBSCRIPTIONS_COMPLETE.md +309 -0
- package/SUMMARY.md +272 -0
- package/Spec.md +2778 -0
- package/dist/errors/index.d.ts +52 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +81 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +37 -0
- package/dist/index.js.map +1 -0
- package/dist/protocol/ProtocolHandler.d.ts +37 -0
- package/dist/protocol/ProtocolHandler.d.ts.map +1 -0
- package/dist/protocol/ProtocolHandler.js +172 -0
- package/dist/protocol/ProtocolHandler.js.map +1 -0
- package/dist/server.d.ts +6 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +502 -0
- package/dist/server.js.map +1 -0
- package/dist/stores/InMemoryStore.d.ts +27 -0
- package/dist/stores/InMemoryStore.d.ts.map +1 -0
- package/dist/stores/InMemoryStore.js +73 -0
- package/dist/stores/InMemoryStore.js.map +1 -0
- package/dist/stores/RedisStore.d.ts +18 -0
- package/dist/stores/RedisStore.d.ts.map +1 -0
- package/dist/stores/RedisStore.js +45 -0
- package/dist/stores/RedisStore.js.map +1 -0
- package/dist/stores/index.d.ts +3 -0
- package/dist/stores/index.d.ts.map +1 -0
- package/dist/stores/index.js +9 -0
- package/dist/stores/index.js.map +1 -0
- package/dist/subscriptions/SubscriptionManager.d.ts +49 -0
- package/dist/subscriptions/SubscriptionManager.d.ts.map +1 -0
- package/dist/subscriptions/SubscriptionManager.js +181 -0
- package/dist/subscriptions/SubscriptionManager.js.map +1 -0
- package/dist/types/index.d.ts +271 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +16 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/index.d.ts +51 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +154 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/webhooks/WebhookManager.d.ts +27 -0
- package/dist/webhooks/WebhookManager.d.ts.map +1 -0
- package/dist/webhooks/WebhookManager.js +174 -0
- package/dist/webhooks/WebhookManager.js.map +1 -0
- package/examples/GITHUB_LIVE_EXAMPLE.md +308 -0
- package/examples/GITHUB_LIVE_SETUP.md +253 -0
- package/examples/QUICKSTART.md +130 -0
- package/examples/basic-setup.ts +142 -0
- package/examples/github-server-live.ts +690 -0
- package/examples/github-server.ts +223 -0
- package/examples/google-drive-server-live.ts +773 -0
- package/examples/start-github-live.sh +53 -0
- package/jest.config.js +20 -0
- package/package.json +58 -0
- package/src/errors/index.ts +81 -0
- package/src/index.ts +19 -0
- package/src/server.ts +595 -0
- package/src/stores/InMemoryStore.ts +87 -0
- package/src/stores/RedisStore.ts +51 -0
- package/src/stores/index.ts +2 -0
- package/src/subscriptions/SubscriptionManager.ts +240 -0
- package/src/types/index.ts +341 -0
- package/src/utils/index.ts +156 -0
- package/src/webhooks/WebhookManager.ts +230 -0
- package/test-sdk-integration.sh +157 -0
- 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
|
+
});
|