@noresponse/mcp 0.0.0-stage → 0.3.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/CHANGELOG.md +279 -0
- package/LICENSE +202 -0
- package/README.md +79 -2
- package/bin/mcp-server.js +63634 -0
- package/bin/mcp-server.js.map +376 -0
- package/manifest.json +126 -0
- package/package.json +80 -4
package/manifest.json
ADDED
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
{
|
|
2
|
+
"author": {
|
|
3
|
+
"name": "NoResponse"
|
|
4
|
+
},
|
|
5
|
+
"description": "Assess signups and gateway events for abuse risk, wait for pending assessments, page an account's history and record outcomes.",
|
|
6
|
+
"display_name": "NoResponse",
|
|
7
|
+
"homepage": "https://docs.noresponse.org",
|
|
8
|
+
"keywords": [
|
|
9
|
+
"@noresponse/mcp",
|
|
10
|
+
"assess",
|
|
11
|
+
"account",
|
|
12
|
+
"creation",
|
|
13
|
+
"login",
|
|
14
|
+
"purchase"
|
|
15
|
+
],
|
|
16
|
+
"license": "Apache-2.0",
|
|
17
|
+
"long_description": "Assess an account creation, login or purchase and get back the account's one current risk, poll a pending assessment, page through an account's history, record what you later learned, report usage of the API keys you issue to your accounts, rotate your API key, manage your webhook endpoints, and register hosted endpoints that answer your WorkOS or Auth0 sign-up and sign-in hooks. Every response carries X-Request-ID; every error is an RFC 9457 problem document. Keep the API key on your server.",
|
|
18
|
+
"manifest_version": "0.3",
|
|
19
|
+
"name": "noresponse",
|
|
20
|
+
"prompts": [],
|
|
21
|
+
"server": {
|
|
22
|
+
"type": "node",
|
|
23
|
+
"entry_point": "./bin/mcp-server.js",
|
|
24
|
+
"mcp_config": {
|
|
25
|
+
"command": "node",
|
|
26
|
+
"args": [
|
|
27
|
+
"${__dirname}/bin/mcp-server.js",
|
|
28
|
+
"start",
|
|
29
|
+
"--api-key",
|
|
30
|
+
"${user_config.api_key}"
|
|
31
|
+
]
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
"user_config": {
|
|
35
|
+
"api_key": {
|
|
36
|
+
"description": "Your NoResponse API key (nrk_...). It stays on this computer and is sent only to api.noresponse.org.",
|
|
37
|
+
"required": true,
|
|
38
|
+
"sensitive": true,
|
|
39
|
+
"title": "API key",
|
|
40
|
+
"type": "string"
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
"version": "0.3.0",
|
|
44
|
+
"tools": [
|
|
45
|
+
{
|
|
46
|
+
"name": "create_assessment",
|
|
47
|
+
"description": "Assess identifiers for a signup or gateway decision.\n\nAssesses one account creation, login or purchase (flow) and answers with the account's one current risk: account.risk.decision is the decision for this flow (allow, step_up, review or block, where block means your block threshold was reached), and detail holds this assessment's own facts. depth sets how long the answer waits for sources: quick waits only for the fast ones (500 ms), full for the whole budget (3000 ms at most); it defaults to full for account_creation and purchase and quick for login. 200 carries complete or partial, 202 carries pending with Location and Retry-After. While the account's first assessment is pending, account is absent: apply your own fallback for that, 429, 503 or a timeout. NoResponse blocks nothing itself; you decide. Requires the assess scope. Idempotency-Key is optional in the SDK and is bound to the body for 24 hours: the same key with the same body replays the latest assessment with Idempotent-Replayed: true and starts no new work; the same key with a different body answers 409 idempotency_key_reused. response_mode defaults to standard; detailed needs the detailed scope."
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
"name": "get_assessment",
|
|
51
|
+
"description": "Poll the authoritative assessment of one assessment.\n\nReturns the highest assessment_version, with the account's current risk. Requires the assess or history scope. While status is pending, or partial with a source still running, the response carries Retry-After; poll no faster than it says. Another workspace's assessment, an unknown or expired assessment and a malformed assessment_id all answer 404 not_found. response_mode=detailed needs the detailed scope."
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
"name": "delete_assessment",
|
|
55
|
+
"description": "Delete one assessment.\n\nDeletes one assessment in the environment of your key, with its versions, evidence and outcomes and the identity-graph marks its outcomes set, and scores its account again from what remains. Afterwards the assessment answers 404 and leaves the account's history. The answer names the account and the assessment its current risk now comes from; current_assessment_id is absent when the account has no assessment with a decision left. Requires the history scope. An unknown, expired or already deleted assessment answers 404, so a repeat answers 404; to erase a whole account idempotently, use accounts.delete."
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
"name": "record_outcome",
|
|
59
|
+
"description": "Report what was later learned about an assessed account.\n\nRecords what you later learned about an assessed account: confirmed_abuse, account_takeover and chargeback report abuse; false_positive and legitimate withdraw your earlier report; unknown is recorded only. Outcomes are append-only and the latest one wins. Requires the assess scope. Idempotency-Key is optional in the SDK and handled as on POST /v1/assessments: a retry with the same key and body answers the same record with Idempotent-Replayed: true; a different body answers 409. An unknown, expired or foreign assessment answers 404 not_found."
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
"name": "query_assessments",
|
|
63
|
+
"description": "Page through one account's unexpired assessments.\n\nHistory is a POST with account_id in the body so an account identifier stays out of URLs and access logs. Requires the history scope. Read-only and safe to retry. Newest first, each at its latest assessment_version. An account with no assessments answers 200 with empty items. The cursor is opaque and bound to your workspace and the account; a tampered or expired cursor answers 400 invalid_cursor. response_mode=detailed needs the detailed scope."
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
"name": "get_account",
|
|
67
|
+
"description": "Read an account's one current risk.\n\nAn account is the account_id you send with your assessments. Its current risk is the risk of its latest assessment with a decision (status complete or partial), scored as GET /v1/assessments/{assessment_id} scores that assessment, with a decision for each flow; risk.decision is the decision for the flow of that assessment. Every assessment answers with this same account. Every assessment updates its account: once an assessment completes, the account carries its risk. Requires the history scope. Read-only and safe to retry. An account with no unexpired assessment that has a decision answers 404 not_found, and a malformed account_id answers 400 invalid_request."
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
"name": "delete_account",
|
|
71
|
+
"description": "Erase an account and its history.\n\nErases the account in the environment of your key, for an erasure request from your user: every assessment of it, with its revisions, evidence and outcomes, and the identity-graph marks its outcomes set. An assessment of the account begun before the call is refused or stopped. Afterwards the account and each erased assessment answer 404 and the history is empty. When the call deleted at least one assessment, an account.deleted event goes to your verified webhook endpoints. Requires the history scope. Idempotent and safe to retry: a repeat, or an account with nothing to erase, answers 200 with assessments_deleted 0 and sends no event. The account_id can be assessed again later, as a new account."
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
"name": "list_account_assessments",
|
|
75
|
+
"description": "Page through one account's unexpired assessments.\n\nThe account's history: the same page as POST /v1/assessments/query for this account_id, newest first, each at its latest assessment_version. Requires the history scope. Read-only and safe to retry. An account with no assessments answers 200 with empty items. The cursor is opaque and bound to your workspace and the account; a tampered or expired cursor answers 400 invalid_cursor. response_mode=detailed needs the detailed scope. The account_id travels in the URL; use POST /v1/assessments/query to keep it out of access logs."
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
"name": "create_integration",
|
|
79
|
+
"description": "Register a hosted provider integration.\n\nRegisters a WorkOS or Auth0 integration and returns its hosted endpoint, url, so a sign-up or sign-in is scored with no server of your own. For WorkOS, send the Actions signing secret from the WorkOS dashboard and point the user registration and authentication Actions at url. For Auth0, the answer's secret is the shared secret of the NoResponse Auth0 Action, shown once: store it as an Action secret. hook_points defaults to both pre_registration and post_login; an event that is not listed is allowed without an assessment. The endpoint waits for the full assessment for at most 2.5 seconds (WorkOS) or 4.5 seconds (Auth0), denies only when risk.block is true and allows on any failure. Requires the integrations scope; at most 10 per account. Not idempotent: a retry after a lost answer registers another integration."
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
"name": "list_integrations",
|
|
83
|
+
"description": "List the workspace's integrations.\n\nEvery integration, oldest first. Listings carry no secrets. Requires the integrations scope."
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
"name": "delete_integration",
|
|
87
|
+
"description": "Delete an integration.\n\nRemoves the integration and its secrets; its endpoint answers 404 from then on, so remove the Action from the provider first. Requires the integrations scope. An unknown or already deleted integration answers 404."
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
"name": "rotate_integration_secret",
|
|
91
|
+
"description": "Replace an integration's secret.\n\nFor Auth0, send {} and the answer's secret is the new shared secret, shown once. For WorkOS, regenerate the Actions secret in the WorkOS dashboard and send it as signing_secret. The replaced secret is still accepted for 24 hours (previous_secret_expires_at). Requires the integrations scope. Not idempotent: a retry after a lost answer rotates again."
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
"name": "list_webhook_endpoints",
|
|
95
|
+
"description": "List the workspace's webhook endpoints.\n\nLists your webhook endpoints in every state, ordered by endpoint_id, with the ids of their signing keys and without secrets. Requires the webhooks scope."
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
"name": "create_webhook_endpoint",
|
|
99
|
+
"description": "Register a webhook endpoint.\n\nRegisters a webhook endpoint and returns it with its first signing secret, shown only in this answer: store it where your receiver reads it. The URL is https on port 443 or 8443 with a DNS host whose every address is public; it is checked now and on every delivery. The endpoint starts unverified and receives assessment events once it echoes an endpoint.verification challenge, which sendTestEvent sends. You can hold 5 endpoints. Requires the webhooks scope, and response_mode detailed also the detailed scope. Registration is not idempotent: a retry after a lost answer registers a second endpoint, which you can list and delete."
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
"name": "delete_webhook_endpoint",
|
|
103
|
+
"description": "Delete a webhook endpoint.\n\nDeletes the endpoint and its signing keys. Deliveries still queued for it are dropped. Requires the webhooks scope. An endpoint that is already gone answers 404."
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
"name": "rotate_webhook_signing_key",
|
|
107
|
+
"description": "Rotate an endpoint's signing key.\n\nIssues a new signing key for the endpoint and returns its secret once. Every delivery from now on is signed with it; the key it replaces keeps verifying for 7 days, so your receiver can hold both while it switches. Requires the webhooks scope. Rotation is not idempotent: a retry after a lost answer issues another key, which replaces the first."
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
"name": "send_webhook_test_event",
|
|
111
|
+
"description": "Send a test event to an endpoint.\n\nendpoint.verification sends a signed challenge now and answers whether the endpoint echoed it within 5 seconds; an echo verifies the endpoint, including a disabled one. assessment.updated queues one signed event with test: true and a fixed example assessment in the endpoint's response mode, delivered and retried like any other event; the endpoint must be verified. Both use the endpoint's current signing key. Requires the webhooks scope."
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
"name": "list_webhook_deliveries",
|
|
115
|
+
"description": "List an endpoint's delivery attempts.\n\nEvery POST the endpoint received, newest first: the event id and type, which attempt it was, whether it was a replay, delivered or failed, the response code, why it failed and how long it took. Attempts are kept for 30 days, or your retention_days when that is shorter, and are deleted with the assessment they carried. Requires the webhooks scope. Read-only and safe to retry. The cursor is opaque and bound to your workspace and the endpoint; a tampered or expired cursor answers 400 invalid_cursor."
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
"name": "replay_webhook_delivery",
|
|
119
|
+
"description": "Send one delivery again.\n\nQueues the event for the endpoint again: the same event id and body it received, with a new NR-Webhook-Timestamp and a signature from the endpoint's current signing key, retried like any other delivery and listed with replay: true. Your receiver deduplicates on the event id. The endpoint must be verified. Requires the webhooks scope. Not idempotent: each call, a retry included, sends the event again."
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
"name": "wait_for_assessment",
|
|
123
|
+
"description": "Wait until an assessment is complete, then return it.\n\nPolls get_assessment at the interval the API's Retry-After asks for (at least once a second) until status is complete, or until timeout_seconds pass. When the time runs out the result says so and carries the latest answer, and you can call this tool again. A partial answer has a recommendation you can act on while a lane is still running; a pending one has none, so apply your own fallback until it settles. Requires the assess or history scope."
|
|
124
|
+
}
|
|
125
|
+
]
|
|
126
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,82 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@noresponse/mcp",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
3
|
+
"version": "0.3.0",
|
|
4
|
+
"mcpName": "org.noresponse/mcp",
|
|
5
|
+
"author": "NoResponse",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"sideEffects": false,
|
|
8
|
+
"bugs": {
|
|
9
|
+
"url": "https://github.com/noresponsehq/mcp/issues"
|
|
10
|
+
},
|
|
11
|
+
"description": "NoResponse signup and gateway risk assessment as an MCP server, for agents",
|
|
12
|
+
"files": [
|
|
13
|
+
"bin",
|
|
14
|
+
"manifest.json",
|
|
15
|
+
"LICENSE",
|
|
16
|
+
"README.md",
|
|
17
|
+
"CHANGELOG.md"
|
|
18
|
+
],
|
|
19
|
+
"homepage": "https://docs.noresponse.org",
|
|
20
|
+
"keywords": [
|
|
21
|
+
"noresponse",
|
|
22
|
+
"mcp",
|
|
23
|
+
"signup",
|
|
24
|
+
"fraud",
|
|
25
|
+
"risk",
|
|
26
|
+
"identity"
|
|
27
|
+
],
|
|
28
|
+
"license": "Apache-2.0",
|
|
29
|
+
"repository": {
|
|
30
|
+
"url": "git+https://github.com/noresponsehq/mcp.git",
|
|
31
|
+
"type": "git"
|
|
32
|
+
},
|
|
33
|
+
"bin": {
|
|
34
|
+
"noresponse-mcp": "bin/mcp-server.js"
|
|
35
|
+
},
|
|
36
|
+
"scripts": {
|
|
37
|
+
"build": "bun i && bun src/mcp-server/build.mts && tsc",
|
|
38
|
+
"mcpb:build": "bun i && bun src/mcp-server/build.mts --pack && tsc",
|
|
39
|
+
"types": "wrangler types",
|
|
40
|
+
"dev": "wrangler dev",
|
|
41
|
+
"deploy": "wrangler deploy",
|
|
42
|
+
"check": "npm run lint",
|
|
43
|
+
"lint": "eslint --cache --max-warnings=0 src",
|
|
44
|
+
"prepublishOnly": "npm run build",
|
|
45
|
+
"test": "node --test tests/*.test.mjs"
|
|
46
|
+
},
|
|
47
|
+
"dependencies": {
|
|
48
|
+
"@modelcontextprotocol/node": "2.1.1",
|
|
49
|
+
"@modelcontextprotocol/sdk": "^1.32.1",
|
|
50
|
+
"@modelcontextprotocol/server": "2.3.1",
|
|
51
|
+
"@modelcontextprotocol/server-legacy": "2.3.1",
|
|
52
|
+
"@stricli/core": "^1.1.2",
|
|
53
|
+
"express": "^5.1.0",
|
|
54
|
+
"zod": "^4.2.0"
|
|
55
|
+
},
|
|
56
|
+
"overrides": {
|
|
57
|
+
"hono": ">=4.12.34",
|
|
58
|
+
"fast-uri": ">=4.1.2 <5.0.0",
|
|
59
|
+
"js-yaml": ">=4.3.1 <5.0.0",
|
|
60
|
+
"ip-address": ">=10.3.1 <11.0.0",
|
|
61
|
+
"nanoid@^5.0.0": ">=5.1.16 <6.0.0",
|
|
62
|
+
"brace-expansion@^2.0.0": ">=2.1.4 <3.0.0",
|
|
63
|
+
"body-parser": ">=2.3.0 <3.0.0"
|
|
64
|
+
},
|
|
65
|
+
"devDependencies": {
|
|
66
|
+
"@anthropic-ai/mcpb": "^1.2.0",
|
|
67
|
+
"@cloudflare/workers-types": "^4.20250712.0 || ^5.20261006.1",
|
|
68
|
+
"@eslint/js": "^9.26.0",
|
|
69
|
+
"@types/bun": "^1.2.13",
|
|
70
|
+
"@types/express": "^5.0.1",
|
|
71
|
+
"@types/node": "^18.19.3",
|
|
72
|
+
"bun": "^1.2.12",
|
|
73
|
+
"eslint": "^9.26.0",
|
|
74
|
+
"globals": "^16.0.0",
|
|
75
|
+
"typescript": "~5.8.3",
|
|
76
|
+
"typescript-eslint": "^8.31.1",
|
|
77
|
+
"wrangler": "^4.59.1"
|
|
78
|
+
},
|
|
79
|
+
"engines": {
|
|
80
|
+
"node": ">=20"
|
|
81
|
+
}
|
|
82
|
+
}
|