id-verify-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 +21 -0
- package/README.md +103 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +460 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/apiClient.d.ts +147 -0
- package/dist/utils/apiClient.d.ts.map +1 -0
- package/dist/utils/apiClient.js +280 -0
- package/dist/utils/apiClient.js.map +1 -0
- package/dist/worker.d.ts +14 -0
- package/dist/worker.d.ts.map +1 -0
- package/dist/worker.js +333 -0
- package/dist/worker.js.map +1 -0
- package/package.json +55 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2024 Tanveer Afzal
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
# ID Verify MCP Server
|
|
2
|
+
|
|
3
|
+
MCP (Model Context Protocol) server that enables AI assistants like Claude to perform identity verifications through the ID Verify API.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install -g id-verify-mcp
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Quick Start
|
|
12
|
+
|
|
13
|
+
### 1. Get your API Key
|
|
14
|
+
|
|
15
|
+
Sign up at [ID Verify](https://your-id-verify-site.com) to get your API key.
|
|
16
|
+
|
|
17
|
+
### 2. Configure Claude Desktop
|
|
18
|
+
|
|
19
|
+
Add to your Claude Desktop configuration file:
|
|
20
|
+
|
|
21
|
+
**macOS:** `~/Library/Application Support/Claude/claude_desktop_config.json`
|
|
22
|
+
**Windows:** `%APPDATA%\Claude\claude_desktop_config.json`
|
|
23
|
+
|
|
24
|
+
```json
|
|
25
|
+
{
|
|
26
|
+
"mcpServers": {
|
|
27
|
+
"id-verify": {
|
|
28
|
+
"command": "id-verify-mcp",
|
|
29
|
+
"env": {
|
|
30
|
+
"ID_VERIFY_API_KEY": "your_api_key_here"
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
### 3. Restart Claude Desktop
|
|
38
|
+
|
|
39
|
+
Restart Claude Desktop to load the MCP server.
|
|
40
|
+
|
|
41
|
+
## Configuration
|
|
42
|
+
|
|
43
|
+
| Environment Variable | Description | Default |
|
|
44
|
+
|---------------------|-------------|---------|
|
|
45
|
+
| `ID_VERIFY_API_KEY` | Your API key (required) | - |
|
|
46
|
+
| `ID_VERIFY_API_URL` | API base URL | `https://id-verify-api.com` |
|
|
47
|
+
|
|
48
|
+
## Available Tools
|
|
49
|
+
|
|
50
|
+
### Verification Tools
|
|
51
|
+
- `create_verification` - Create a new identity verification request
|
|
52
|
+
- `get_verification` - Get verification status by ID
|
|
53
|
+
- `get_verification_result` - Get detailed verification result
|
|
54
|
+
|
|
55
|
+
### Partner Tools (requires `partner_login` first)
|
|
56
|
+
- `register_partner` - Register a new partner account
|
|
57
|
+
- `partner_login` - Login as a partner
|
|
58
|
+
- `partner_profile` - Get partner profile
|
|
59
|
+
- `partner_verifications` - List partner's verifications
|
|
60
|
+
- `partner_verification_detail` - Get specific verification details
|
|
61
|
+
- `partner_usage_stats` - Get usage statistics
|
|
62
|
+
- `partner_webhook_logs` - Get webhook delivery logs
|
|
63
|
+
- `partner_request_verification` - Create verification as partner
|
|
64
|
+
- `partner_resend_email` - Resend verification email
|
|
65
|
+
- `partner_resend_webhook` - Resend webhook notification
|
|
66
|
+
|
|
67
|
+
### Admin Tools
|
|
68
|
+
- `admin_create_partner` - Create a new partner
|
|
69
|
+
- `admin_list_partners` - List all partners
|
|
70
|
+
- `admin_get_partner` - Get partner by ID
|
|
71
|
+
- `admin_update_partner` - Update partner settings
|
|
72
|
+
- `admin_delete_partner` - Delete a partner
|
|
73
|
+
|
|
74
|
+
## Example Prompts
|
|
75
|
+
|
|
76
|
+
Once configured, you can ask Claude:
|
|
77
|
+
|
|
78
|
+
- "Create a verification for John Doe with email john@example.com"
|
|
79
|
+
- "What's the status of verification abc-123?"
|
|
80
|
+
- "Show me all failed verifications"
|
|
81
|
+
- "Login as partner with email partner@example.com"
|
|
82
|
+
- "Show my verification statistics"
|
|
83
|
+
|
|
84
|
+
## Development
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
# Clone the repository
|
|
88
|
+
git clone https://github.com/tanveerafzal/id-verify-mcp.git
|
|
89
|
+
cd id-verify-mcp
|
|
90
|
+
|
|
91
|
+
# Install dependencies
|
|
92
|
+
npm install
|
|
93
|
+
|
|
94
|
+
# Build
|
|
95
|
+
npm run build
|
|
96
|
+
|
|
97
|
+
# Run locally
|
|
98
|
+
ID_VERIFY_API_KEY=your_key npm start
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## License
|
|
102
|
+
|
|
103
|
+
MIT
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* ID Verify MCP Server
|
|
4
|
+
*
|
|
5
|
+
* Exposes the ID Verify API as MCP tools for AI assistants.
|
|
6
|
+
*
|
|
7
|
+
* Environment variables:
|
|
8
|
+
* ID_VERIFY_API_URL - Base URL of the ID Verify API (default: http://localhost:3000)
|
|
9
|
+
* ID_VERIFY_API_KEY - Partner API key for authentication
|
|
10
|
+
*/
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;;;GAQG"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,460 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* ID Verify MCP Server
|
|
4
|
+
*
|
|
5
|
+
* Exposes the ID Verify API as MCP tools for AI assistants.
|
|
6
|
+
*
|
|
7
|
+
* Environment variables:
|
|
8
|
+
* ID_VERIFY_API_URL - Base URL of the ID Verify API (default: http://localhost:3000)
|
|
9
|
+
* ID_VERIFY_API_KEY - Partner API key for authentication
|
|
10
|
+
*/
|
|
11
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
12
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
13
|
+
import { z } from "zod";
|
|
14
|
+
import { IdVerifyApiClient } from "./utils/apiClient.js";
|
|
15
|
+
// Initialize API client
|
|
16
|
+
const apiClient = new IdVerifyApiClient();
|
|
17
|
+
// Create MCP server
|
|
18
|
+
const server = new McpServer({
|
|
19
|
+
name: "id-verify-mcp",
|
|
20
|
+
version: "1.0.0"
|
|
21
|
+
});
|
|
22
|
+
// =============================================================================
|
|
23
|
+
// API KEY AUTH TOOLS (Verification API)
|
|
24
|
+
// =============================================================================
|
|
25
|
+
/**
|
|
26
|
+
* Tool: create_verification
|
|
27
|
+
* Creates a new identity verification request
|
|
28
|
+
*/
|
|
29
|
+
server.tool("create_verification", "Create a new identity verification request using API key. Returns a verification ID and link to send to the user.", {
|
|
30
|
+
fullName: z.string().optional().describe("User's full legal name (for name matching)"),
|
|
31
|
+
email: z.string().email().optional().describe("User's email address for notifications"),
|
|
32
|
+
phone: z.string().optional().describe("User's phone number for SMS notifications"),
|
|
33
|
+
documentType: z.enum([
|
|
34
|
+
"PASSPORT",
|
|
35
|
+
"DRIVERS_LICENSE",
|
|
36
|
+
"NATIONAL_ID",
|
|
37
|
+
"HEALTH_CARD",
|
|
38
|
+
"OTHER"
|
|
39
|
+
]).optional().describe("Expected document type"),
|
|
40
|
+
callbackUrl: z.string().url().optional().describe("Webhook URL for verification result callback")
|
|
41
|
+
}, async ({ fullName, email, phone, documentType, callbackUrl }) => {
|
|
42
|
+
const result = await apiClient.createVerification({
|
|
43
|
+
fullName,
|
|
44
|
+
email,
|
|
45
|
+
phone,
|
|
46
|
+
documentType,
|
|
47
|
+
callbackUrl
|
|
48
|
+
});
|
|
49
|
+
return {
|
|
50
|
+
content: [{
|
|
51
|
+
type: "text",
|
|
52
|
+
text: JSON.stringify(result, null, 2)
|
|
53
|
+
}]
|
|
54
|
+
};
|
|
55
|
+
});
|
|
56
|
+
/**
|
|
57
|
+
* Tool: get_verification
|
|
58
|
+
* Get details of a specific verification
|
|
59
|
+
*/
|
|
60
|
+
server.tool("get_verification", "Get the current status and details of a verification by its ID (uses API key auth)", {
|
|
61
|
+
verificationId: z.string().uuid().describe("The verification ID (UUID format)")
|
|
62
|
+
}, async ({ verificationId }) => {
|
|
63
|
+
const result = await apiClient.getVerification(verificationId);
|
|
64
|
+
return {
|
|
65
|
+
content: [{
|
|
66
|
+
type: "text",
|
|
67
|
+
text: JSON.stringify(result, null, 2)
|
|
68
|
+
}]
|
|
69
|
+
};
|
|
70
|
+
});
|
|
71
|
+
/**
|
|
72
|
+
* Tool: get_verification_result
|
|
73
|
+
* Get the detailed result of a completed verification
|
|
74
|
+
*/
|
|
75
|
+
server.tool("get_verification_result", "Get the detailed verification result including extracted data, scores, and failure reasons", {
|
|
76
|
+
verificationId: z.string().uuid().describe("The verification ID (UUID format)")
|
|
77
|
+
}, async ({ verificationId }) => {
|
|
78
|
+
const result = await apiClient.getVerificationResult(verificationId);
|
|
79
|
+
// Format the result for better readability
|
|
80
|
+
if (result.success && result.data) {
|
|
81
|
+
const data = result.data;
|
|
82
|
+
let summary = `## Verification Result\n\n`;
|
|
83
|
+
summary += `**Status:** ${data.passed ? '✅ PASSED' : '❌ FAILED'}\n`;
|
|
84
|
+
summary += `**Score:** ${(data.score * 100).toFixed(1)}%\n`;
|
|
85
|
+
summary += `**Risk Level:** ${data.riskLevel}\n\n`;
|
|
86
|
+
if (data.extractedData) {
|
|
87
|
+
summary += `### Extracted Data\n`;
|
|
88
|
+
summary += `- **Name:** ${data.extractedData.fullName || 'N/A'}\n`;
|
|
89
|
+
summary += `- **DOB:** ${data.extractedData.dateOfBirth || 'N/A'}\n`;
|
|
90
|
+
summary += `- **Document Number:** ${data.extractedData.documentNumber || 'N/A'}\n`;
|
|
91
|
+
summary += `- **Expiry Date:** ${data.extractedData.expiryDate || 'N/A'}\n`;
|
|
92
|
+
summary += `- **Country:** ${data.extractedData.issuingCountry || 'N/A'}\n\n`;
|
|
93
|
+
}
|
|
94
|
+
if (data.checks) {
|
|
95
|
+
summary += `### Verification Checks\n`;
|
|
96
|
+
summary += `- **Face Match:** ${data.checks.faceMatch ? '✅' : '❌'} (${(data.checks.faceMatchScore * 100).toFixed(1)}%)\n`;
|
|
97
|
+
summary += `- **Name Match:** ${data.checks.nameMatch ? '✅' : '❌'} (${(data.checks.nameMatchScore * 100).toFixed(1)}%)\n`;
|
|
98
|
+
summary += `- **Liveness Check:** ${data.checks.livenessCheck ? '✅' : '❌'}\n`;
|
|
99
|
+
summary += `- **Document Authentic:** ${data.checks.documentAuthentic ? '✅' : '❌'}\n`;
|
|
100
|
+
summary += `- **Document Expired:** ${data.checks.documentExpired ? '❌ Yes' : '✅ No'}\n\n`;
|
|
101
|
+
}
|
|
102
|
+
if (data.flags && data.flags.length > 0) {
|
|
103
|
+
summary += `### Flags\n`;
|
|
104
|
+
data.flags.forEach((flag) => {
|
|
105
|
+
summary += `- ⚠️ ${flag}\n`;
|
|
106
|
+
});
|
|
107
|
+
summary += '\n';
|
|
108
|
+
}
|
|
109
|
+
if (data.failureReasons && data.failureReasons.length > 0) {
|
|
110
|
+
summary += `### Failure Reasons\n`;
|
|
111
|
+
data.failureReasons.forEach((reason) => {
|
|
112
|
+
summary += `- ${reason}\n`;
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
return {
|
|
116
|
+
content: [{
|
|
117
|
+
type: "text",
|
|
118
|
+
text: summary + '\n---\n\n**Raw Data:**\n```json\n' + JSON.stringify(result, null, 2) + '\n```'
|
|
119
|
+
}]
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
return {
|
|
123
|
+
content: [{
|
|
124
|
+
type: "text",
|
|
125
|
+
text: JSON.stringify(result, null, 2)
|
|
126
|
+
}]
|
|
127
|
+
};
|
|
128
|
+
});
|
|
129
|
+
// =============================================================================
|
|
130
|
+
// PUBLIC TOOLS (No Authentication Required)
|
|
131
|
+
// =============================================================================
|
|
132
|
+
/**
|
|
133
|
+
* Tool: register_partner
|
|
134
|
+
* Register a new partner account
|
|
135
|
+
*/
|
|
136
|
+
server.tool("register_partner", "Register a new partner account using the public registration endpoint. No authentication required.", {
|
|
137
|
+
email: z.string().email().describe("Partner's email address (used for login)"),
|
|
138
|
+
contactName: z.string().describe("Partner's contact name"),
|
|
139
|
+
password: z.string().min(8).describe("Partner's password (min 8 characters)"),
|
|
140
|
+
companyName: z.string().optional().describe("Partner's company name"),
|
|
141
|
+
phone: z.string().optional().describe("Partner's phone number"),
|
|
142
|
+
webhookUrl: z.string().url().optional().describe("Webhook URL for verification callbacks")
|
|
143
|
+
}, async ({ email, contactName, password, companyName, phone, webhookUrl }) => {
|
|
144
|
+
const result = await apiClient.registerPartner({
|
|
145
|
+
email,
|
|
146
|
+
contactName,
|
|
147
|
+
password,
|
|
148
|
+
companyName,
|
|
149
|
+
phone,
|
|
150
|
+
webhookUrl
|
|
151
|
+
});
|
|
152
|
+
return {
|
|
153
|
+
content: [{
|
|
154
|
+
type: "text",
|
|
155
|
+
text: JSON.stringify(result, null, 2)
|
|
156
|
+
}]
|
|
157
|
+
};
|
|
158
|
+
});
|
|
159
|
+
// =============================================================================
|
|
160
|
+
// PARTNER AUTH TOOLS (JWT Authentication)
|
|
161
|
+
// =============================================================================
|
|
162
|
+
/**
|
|
163
|
+
* Tool: partner_login
|
|
164
|
+
* Login as a partner to access partner-specific APIs
|
|
165
|
+
*/
|
|
166
|
+
server.tool("partner_login", "Login as a partner to access partner-specific APIs. Required before using partner_* tools.", {
|
|
167
|
+
email: z.string().email().describe("Partner account email"),
|
|
168
|
+
password: z.string().describe("Partner account password")
|
|
169
|
+
}, async ({ email, password }) => {
|
|
170
|
+
const result = await apiClient.partnerLogin(email, password);
|
|
171
|
+
if (result.success && apiClient.isAuthenticated()) {
|
|
172
|
+
return {
|
|
173
|
+
content: [{
|
|
174
|
+
type: "text",
|
|
175
|
+
text: `✅ Login successful! JWT token stored. You can now use partner_* tools.\n\n${JSON.stringify(result, null, 2)}`
|
|
176
|
+
}]
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
if (result.success && !apiClient.isAuthenticated()) {
|
|
180
|
+
return {
|
|
181
|
+
content: [{
|
|
182
|
+
type: "text",
|
|
183
|
+
text: `⚠️ Login API returned success but no JWT token was found in the response.\n\nFull response:\n${JSON.stringify(result, null, 2)}`
|
|
184
|
+
}]
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
return {
|
|
188
|
+
content: [{
|
|
189
|
+
type: "text",
|
|
190
|
+
text: JSON.stringify(result, null, 2)
|
|
191
|
+
}]
|
|
192
|
+
};
|
|
193
|
+
});
|
|
194
|
+
/**
|
|
195
|
+
* Tool: partner_profile
|
|
196
|
+
* Get the logged-in partner's profile
|
|
197
|
+
*/
|
|
198
|
+
server.tool("partner_profile", "Get the logged-in partner's profile information. Requires partner_login first.", {}, async () => {
|
|
199
|
+
const result = await apiClient.getPartnerProfile();
|
|
200
|
+
return {
|
|
201
|
+
content: [{
|
|
202
|
+
type: "text",
|
|
203
|
+
text: JSON.stringify(result, null, 2)
|
|
204
|
+
}]
|
|
205
|
+
};
|
|
206
|
+
});
|
|
207
|
+
/**
|
|
208
|
+
* Tool: partner_verifications
|
|
209
|
+
* Get all verifications for the logged-in partner
|
|
210
|
+
*/
|
|
211
|
+
server.tool("partner_verifications", "List all verifications for the logged-in partner with optional filters. Requires partner_login first.", {
|
|
212
|
+
status: z.enum(["PENDING", "IN_PROGRESS", "COMPLETED", "FAILED", "EXPIRED"])
|
|
213
|
+
.optional()
|
|
214
|
+
.describe("Filter by verification status"),
|
|
215
|
+
limit: z.number().min(1).max(100).optional().default(10)
|
|
216
|
+
.describe("Maximum number of results to return (1-100)"),
|
|
217
|
+
offset: z.number().min(0).optional().default(0)
|
|
218
|
+
.describe("Number of results to skip for pagination"),
|
|
219
|
+
search: z.string().optional()
|
|
220
|
+
.describe("Search by user name or email")
|
|
221
|
+
}, async ({ status, limit, offset, search }) => {
|
|
222
|
+
const result = await apiClient.getPartnerVerifications({
|
|
223
|
+
status,
|
|
224
|
+
limit,
|
|
225
|
+
offset,
|
|
226
|
+
search
|
|
227
|
+
});
|
|
228
|
+
return {
|
|
229
|
+
content: [{
|
|
230
|
+
type: "text",
|
|
231
|
+
text: JSON.stringify(result, null, 2)
|
|
232
|
+
}]
|
|
233
|
+
};
|
|
234
|
+
});
|
|
235
|
+
/**
|
|
236
|
+
* Tool: partner_verification_detail
|
|
237
|
+
* Get detailed information about a specific verification
|
|
238
|
+
*/
|
|
239
|
+
server.tool("partner_verification_detail", "Get detailed information about a specific verification. Requires partner_login first.", {
|
|
240
|
+
verificationId: z.string().uuid().describe("The verification ID (UUID format)")
|
|
241
|
+
}, async ({ verificationId }) => {
|
|
242
|
+
const result = await apiClient.getPartnerVerificationById(verificationId);
|
|
243
|
+
return {
|
|
244
|
+
content: [{
|
|
245
|
+
type: "text",
|
|
246
|
+
text: JSON.stringify(result, null, 2)
|
|
247
|
+
}]
|
|
248
|
+
};
|
|
249
|
+
});
|
|
250
|
+
/**
|
|
251
|
+
* Tool: partner_usage_stats
|
|
252
|
+
* Get usage statistics for the logged-in partner
|
|
253
|
+
*/
|
|
254
|
+
server.tool("partner_usage_stats", "Get usage statistics including verification counts, pass/fail rates, etc. Requires partner_login first.", {}, async () => {
|
|
255
|
+
const result = await apiClient.getPartnerUsageStats();
|
|
256
|
+
return {
|
|
257
|
+
content: [{
|
|
258
|
+
type: "text",
|
|
259
|
+
text: JSON.stringify(result, null, 2)
|
|
260
|
+
}]
|
|
261
|
+
};
|
|
262
|
+
});
|
|
263
|
+
/**
|
|
264
|
+
* Tool: partner_webhook_logs
|
|
265
|
+
* Get webhook delivery logs for the logged-in partner
|
|
266
|
+
*/
|
|
267
|
+
server.tool("partner_webhook_logs", "Get webhook delivery logs showing all webhook attempts. Requires partner_login first.", {}, async () => {
|
|
268
|
+
const result = await apiClient.getPartnerWebhookLogs();
|
|
269
|
+
return {
|
|
270
|
+
content: [{
|
|
271
|
+
type: "text",
|
|
272
|
+
text: JSON.stringify(result, null, 2)
|
|
273
|
+
}]
|
|
274
|
+
};
|
|
275
|
+
});
|
|
276
|
+
/**
|
|
277
|
+
* Tool: partner_request_verification
|
|
278
|
+
* Request a new verification as a partner
|
|
279
|
+
*/
|
|
280
|
+
server.tool("partner_request_verification", "Request a new identity verification. Requires partner_login first.", {
|
|
281
|
+
fullName: z.string().optional().describe("User's full legal name (for name matching)"),
|
|
282
|
+
email: z.string().email().optional().describe("User's email address for notifications"),
|
|
283
|
+
phone: z.string().optional().describe("User's phone number for SMS notifications"),
|
|
284
|
+
documentType: z.enum([
|
|
285
|
+
"PASSPORT",
|
|
286
|
+
"DRIVERS_LICENSE",
|
|
287
|
+
"NATIONAL_ID",
|
|
288
|
+
"HEALTH_CARD",
|
|
289
|
+
"OTHER"
|
|
290
|
+
]).optional().describe("Expected document type")
|
|
291
|
+
}, async ({ fullName, email, phone, documentType }) => {
|
|
292
|
+
const result = await apiClient.requestVerification({
|
|
293
|
+
fullName,
|
|
294
|
+
email,
|
|
295
|
+
phone,
|
|
296
|
+
documentType
|
|
297
|
+
});
|
|
298
|
+
return {
|
|
299
|
+
content: [{
|
|
300
|
+
type: "text",
|
|
301
|
+
text: JSON.stringify(result, null, 2)
|
|
302
|
+
}]
|
|
303
|
+
};
|
|
304
|
+
});
|
|
305
|
+
/**
|
|
306
|
+
* Tool: partner_resend_email
|
|
307
|
+
* Resend verification email to user
|
|
308
|
+
*/
|
|
309
|
+
server.tool("partner_resend_email", "Resend the verification email to the user. Requires partner_login first.", {
|
|
310
|
+
verificationId: z.string().uuid().describe("The verification ID")
|
|
311
|
+
}, async ({ verificationId }) => {
|
|
312
|
+
const result = await apiClient.resendVerificationEmail(verificationId);
|
|
313
|
+
return {
|
|
314
|
+
content: [{
|
|
315
|
+
type: "text",
|
|
316
|
+
text: JSON.stringify(result, null, 2)
|
|
317
|
+
}]
|
|
318
|
+
};
|
|
319
|
+
});
|
|
320
|
+
/**
|
|
321
|
+
* Tool: partner_resend_webhook
|
|
322
|
+
* Resend webhook for a verification
|
|
323
|
+
*/
|
|
324
|
+
server.tool("partner_resend_webhook", "Resend the webhook notification for a completed verification. Requires partner_login first.", {
|
|
325
|
+
verificationId: z.string().uuid().describe("The verification ID")
|
|
326
|
+
}, async ({ verificationId }) => {
|
|
327
|
+
const result = await apiClient.resendWebhook(verificationId);
|
|
328
|
+
return {
|
|
329
|
+
content: [{
|
|
330
|
+
type: "text",
|
|
331
|
+
text: JSON.stringify(result, null, 2)
|
|
332
|
+
}]
|
|
333
|
+
};
|
|
334
|
+
});
|
|
335
|
+
// =============================================================================
|
|
336
|
+
// ADMIN TOOLS (API Key Auth - Partner Management)
|
|
337
|
+
// =============================================================================
|
|
338
|
+
/**
|
|
339
|
+
* Tool: admin_create_partner
|
|
340
|
+
* Create a new partner organization
|
|
341
|
+
*/
|
|
342
|
+
server.tool("admin_create_partner", "Create a new partner organization. Requires admin API key.", {
|
|
343
|
+
name: z.string().describe("Partner's name"),
|
|
344
|
+
email: z.string().email().describe("Partner's email address (used for login)"),
|
|
345
|
+
password: z.string().min(8).describe("Partner's password (min 8 characters)"),
|
|
346
|
+
company: z.string().optional().describe("Partner's company name"),
|
|
347
|
+
webhookUrl: z.string().url().optional().describe("Webhook URL for verification callbacks")
|
|
348
|
+
}, async ({ name, email, password, company, webhookUrl }) => {
|
|
349
|
+
const result = await apiClient.createPartner({
|
|
350
|
+
name,
|
|
351
|
+
email,
|
|
352
|
+
password,
|
|
353
|
+
company,
|
|
354
|
+
webhookUrl
|
|
355
|
+
});
|
|
356
|
+
return {
|
|
357
|
+
content: [{
|
|
358
|
+
type: "text",
|
|
359
|
+
text: JSON.stringify(result, null, 2)
|
|
360
|
+
}]
|
|
361
|
+
};
|
|
362
|
+
});
|
|
363
|
+
/**
|
|
364
|
+
* Tool: admin_list_partners
|
|
365
|
+
* List all partners with optional filters
|
|
366
|
+
*/
|
|
367
|
+
server.tool("admin_list_partners", "List all partners with optional filters. Requires admin API key.", {
|
|
368
|
+
limit: z.number().min(1).max(100).optional().default(10)
|
|
369
|
+
.describe("Maximum number of results to return (1-100)"),
|
|
370
|
+
offset: z.number().min(0).optional().default(0)
|
|
371
|
+
.describe("Number of results to skip for pagination"),
|
|
372
|
+
search: z.string().optional()
|
|
373
|
+
.describe("Search by partner name, email, or company"),
|
|
374
|
+
status: z.enum(["ACTIVE", "INACTIVE", "SUSPENDED"]).optional()
|
|
375
|
+
.describe("Filter by partner status")
|
|
376
|
+
}, async ({ limit, offset, search, status }) => {
|
|
377
|
+
const result = await apiClient.listPartners({
|
|
378
|
+
limit,
|
|
379
|
+
offset,
|
|
380
|
+
search,
|
|
381
|
+
status
|
|
382
|
+
});
|
|
383
|
+
return {
|
|
384
|
+
content: [{
|
|
385
|
+
type: "text",
|
|
386
|
+
text: JSON.stringify(result, null, 2)
|
|
387
|
+
}]
|
|
388
|
+
};
|
|
389
|
+
});
|
|
390
|
+
/**
|
|
391
|
+
* Tool: admin_get_partner
|
|
392
|
+
* Get partner details by ID
|
|
393
|
+
*/
|
|
394
|
+
server.tool("admin_get_partner", "Get detailed information about a specific partner. Requires admin API key.", {
|
|
395
|
+
partnerId: z.string().uuid().describe("The partner ID (UUID format)")
|
|
396
|
+
}, async ({ partnerId }) => {
|
|
397
|
+
const result = await apiClient.getPartner(partnerId);
|
|
398
|
+
return {
|
|
399
|
+
content: [{
|
|
400
|
+
type: "text",
|
|
401
|
+
text: JSON.stringify(result, null, 2)
|
|
402
|
+
}]
|
|
403
|
+
};
|
|
404
|
+
});
|
|
405
|
+
/**
|
|
406
|
+
* Tool: admin_update_partner
|
|
407
|
+
* Update partner settings
|
|
408
|
+
*/
|
|
409
|
+
server.tool("admin_update_partner", "Update a partner's settings. Requires admin API key.", {
|
|
410
|
+
partnerId: z.string().uuid().describe("The partner ID (UUID format)"),
|
|
411
|
+
name: z.string().optional().describe("Partner's new name"),
|
|
412
|
+
company: z.string().optional().describe("Partner's new company name"),
|
|
413
|
+
webhookUrl: z.string().url().optional().describe("New webhook URL"),
|
|
414
|
+
status: z.enum(["ACTIVE", "INACTIVE", "SUSPENDED"]).optional()
|
|
415
|
+
.describe("Partner status")
|
|
416
|
+
}, async ({ partnerId, name, company, webhookUrl, status }) => {
|
|
417
|
+
const result = await apiClient.updatePartner(partnerId, {
|
|
418
|
+
name,
|
|
419
|
+
company,
|
|
420
|
+
webhookUrl,
|
|
421
|
+
status
|
|
422
|
+
});
|
|
423
|
+
return {
|
|
424
|
+
content: [{
|
|
425
|
+
type: "text",
|
|
426
|
+
text: JSON.stringify(result, null, 2)
|
|
427
|
+
}]
|
|
428
|
+
};
|
|
429
|
+
});
|
|
430
|
+
/**
|
|
431
|
+
* Tool: admin_delete_partner
|
|
432
|
+
* Delete a partner
|
|
433
|
+
*/
|
|
434
|
+
server.tool("admin_delete_partner", "Delete a partner organization. This action cannot be undone. Requires admin API key.", {
|
|
435
|
+
partnerId: z.string().uuid().describe("The partner ID (UUID format)")
|
|
436
|
+
}, async ({ partnerId }) => {
|
|
437
|
+
const result = await apiClient.deletePartner(partnerId);
|
|
438
|
+
return {
|
|
439
|
+
content: [{
|
|
440
|
+
type: "text",
|
|
441
|
+
text: JSON.stringify(result, null, 2)
|
|
442
|
+
}]
|
|
443
|
+
};
|
|
444
|
+
});
|
|
445
|
+
// =============================================================================
|
|
446
|
+
// SERVER STARTUP
|
|
447
|
+
// =============================================================================
|
|
448
|
+
async function main() {
|
|
449
|
+
console.error('[id-verify-mcp] Starting MCP server...');
|
|
450
|
+
console.error(`[id-verify-mcp] API URL: ${process.env.ID_VERIFY_API_URL || 'http://localhost:3000'}`);
|
|
451
|
+
console.error(`[id-verify-mcp] API Key: ${process.env.ID_VERIFY_API_KEY ? '***configured***' : 'NOT SET'}`);
|
|
452
|
+
const transport = new StdioServerTransport();
|
|
453
|
+
await server.connect(transport);
|
|
454
|
+
console.error('[id-verify-mcp] Server started successfully');
|
|
455
|
+
}
|
|
456
|
+
main().catch((error) => {
|
|
457
|
+
console.error('[id-verify-mcp] Fatal error:', error);
|
|
458
|
+
process.exit(1);
|
|
459
|
+
});
|
|
460
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|