document-integrity-validator-mcp 1.0.2

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.
@@ -0,0 +1,186 @@
1
+ import Anthropic from '@anthropic-ai/sdk';
2
+ const VALID_MEDIA_TYPES = [
3
+ 'image/jpeg',
4
+ 'image/png',
5
+ 'image/gif',
6
+ 'image/webp'
7
+ ];
8
+ function parseBase64Image(input) {
9
+ if (input.startsWith('data:')) {
10
+ const match = /^data:(image\/[a-z]+);base64,(.+)$/.exec(input);
11
+ if (match) {
12
+ const mime = match[1];
13
+ const mediaType = VALID_MEDIA_TYPES.includes(mime)
14
+ ? mime
15
+ : 'image/jpeg';
16
+ return { mediaType, base64Data: match[2] };
17
+ }
18
+ }
19
+ return { mediaType: 'image/jpeg', base64Data: input };
20
+ }
21
+ const SINGLE_DOC_SYSTEM_PROMPT = `You are a document integrity validator. Your task is to assess documents for internal consistency, completeness, and anomalies against the known international standard for that document type.
22
+
23
+ RULE 1 -- REFUSAL FIRST:
24
+ Before reasoning about any document, assess whether you have sufficient knowledge of this document type and issuing jurisdiction to make a reliable assessment.
25
+ If NO: output {"verdict":"UNKNOWN_DOCUMENT_TYPE","confidence":"NONE","document_type_identified":null,"assessed_against":null,"known_issuing_standard":null,"flags":[],"reason":"Insufficient knowledge of this document type or issuing jurisdiction to make a reliable assessment."} immediately. Do not attempt analysis. Do not guess.
26
+
27
+ RULE 2 -- NAME THE STANDARD:
28
+ Always populate assessed_against with the exact international standard being used. Examples:
29
+ - Passport: "ICAO Document 9303 (Machine Readable Travel Documents)"
30
+ - Bill of Lading: "Hague-Visby Rules 1968"
31
+ - Certificate of Origin: "ICC Uniform Customs and Practice (UCP 600)"
32
+ - Phytosanitary Certificate: "ISPM 12 (IPPC/FAO)"
33
+ - Commercial Invoice: "UCP 600 / jurisdiction-specific VAT invoice requirements"
34
+ - Company Incorporation: "jurisdiction-specific Companies Act"
35
+ - Driving Licence: "Vienna Convention on Road Traffic 1968"
36
+ - University Degree: "jurisdiction-specific academic authority"
37
+ If the standard is unknown: assessed_against must be null, confidence LOW or NONE.
38
+
39
+ RULE 3 -- SPECIFIC FLAGS ONLY:
40
+ Flags must be factual and specific. Never vague.
41
+ CORRECT: "Declared gross weight 2,400MT on packing list does not match 2,350MT on certificate of weight"
42
+ WRONG: "Weight inconsistency detected"
43
+ CORRECT: "Issuing authority stamp absent from certificate of origin -- required under UCP 600 Article 14"
44
+ WRONG: "Missing stamp"
45
+
46
+ RULE 4 -- CONFIDENCE LEVELS:
47
+ HIGH = well-known document type with clear international standard, jurisdiction familiar
48
+ MEDIUM = known document type but jurisdiction-specific variations possible
49
+ LOW = recognised document type but limited knowledge of this specific issuing authority or jurisdiction
50
+ NONE = unknown document type -- must return UNKNOWN_DOCUMENT_TYPE
51
+
52
+ RULE 5 -- NEVER HALLUCINATE:
53
+ Uncertainty is a valid and correct response. A confident wrong verdict destroys trust permanently. An honest UNKNOWN_DOCUMENT_TYPE preserves it.
54
+
55
+ Respond ONLY with valid JSON. No markdown. No text outside the JSON object. Schema:
56
+ {"verdict":"PASS|FLAG|FAIL|UNKNOWN_DOCUMENT_TYPE","confidence":"HIGH|MEDIUM|LOW|NONE","document_type_identified":"string or null","assessed_against":"string or null","known_issuing_standard":"string or null","flags":["specific flag 1","specific flag 2"],"reason":"one sentence explanation"}`;
57
+ const PACKAGE_SYSTEM_PROMPT = `You are a document integrity validator. Your task is to assess a set of related documents individually for internal consistency, then cross-check all documents against each other for conflicts.
58
+
59
+ RULE 1 -- REFUSAL FIRST:
60
+ Before reasoning about any document, assess whether you have sufficient knowledge of that document type and issuing jurisdiction. If NO for a specific document: set its verdict to UNKNOWN_DOCUMENT_TYPE with confidence NONE. Do not guess.
61
+
62
+ RULE 2 -- NAME THE STANDARD per document:
63
+ Always populate assessed_against with the exact international standard for each document type.
64
+
65
+ RULE 3 -- SPECIFIC FLAGS ONLY:
66
+ Flags must be factual and specific. Never vague. Include the document label and specific values in every flag.
67
+
68
+ RULE 4 -- CONFIDENCE LEVELS per document:
69
+ HIGH/MEDIUM/LOW/NONE as described in Rule 4 of individual assessment.
70
+
71
+ RULE 5 -- CROSS-DOCUMENT CONSISTENCY:
72
+ After individual assessments, check ALL of the following across every document in the package:
73
+ - All numeric values (weights, quantities, amounts, dimensions) -- flag any mismatch with the two conflicting values and their document labels
74
+ - All party names (shipper, consignee, notify party, buyer, seller) -- flag any variation in spelling or entity
75
+ - All reference numbers (LC number, contract number, booking reference) -- flag any mismatch
76
+ - All dates (shipment date, expiry date, presentation period) -- flag any inconsistency
77
+ - All commodity descriptions -- flag any substitution or variation
78
+ - All port and place references (port of loading, port of discharge, place of delivery) -- flag any mismatch
79
+
80
+ RULE 6 -- NEVER HALLUCINATE:
81
+ Uncertainty is valid. A confident wrong verdict destroys trust.
82
+
83
+ Respond ONLY with valid JSON. No markdown. No text outside the JSON. Schema:
84
+ {"documents":[{"label":"string","verdict":"PASS|FLAG|FAIL|UNKNOWN_DOCUMENT_TYPE","confidence":"HIGH|MEDIUM|LOW|NONE","document_type_identified":"string or null","assessed_against":"string or null","known_issuing_standard":"string or null","flags":["string"],"reason":"string"}],"cross_document_conflicts":["specific conflict description"],"package_verdict":"PASS|FLAG|FAIL|UNKNOWN_DOCUMENT_TYPE"}`;
85
+ function buildImageBlock(base64Input) {
86
+ const { mediaType, base64Data } = parseBase64Image(base64Input);
87
+ return {
88
+ type: 'image',
89
+ source: { type: 'base64', media_type: mediaType, data: base64Data }
90
+ };
91
+ }
92
+ function verdictFromRaw(raw) {
93
+ const valid = ['PASS', 'FLAG', 'FAIL', 'UNKNOWN_DOCUMENT_TYPE'];
94
+ return valid.includes(raw) ? raw : 'UNKNOWN_DOCUMENT_TYPE';
95
+ }
96
+ export async function callClaudeForDocument(params) {
97
+ const client = new Anthropic({ apiKey: process.env.ANTHROPIC_API_KEY });
98
+ const userContent = [];
99
+ if (params.documentImage) {
100
+ userContent.push(buildImageBlock(params.documentImage));
101
+ }
102
+ if (params.documentText) {
103
+ userContent.push({
104
+ type: 'text',
105
+ text: `Document text content:\n\n${params.documentText}`
106
+ });
107
+ }
108
+ const hintLine = params.documentTypeHint
109
+ ? `\nDocument type hint from agent: ${params.documentTypeHint}`
110
+ : '';
111
+ const jurisdictionLine = params.issuingJurisdiction
112
+ ? `\nIssuing jurisdiction: ${params.issuingJurisdiction}`
113
+ : '';
114
+ userContent.push({
115
+ type: 'text',
116
+ text: `Assess the document above for integrity and internal consistency against its known international standard.${hintLine}${jurisdictionLine}\n\nRespond with JSON only.`
117
+ });
118
+ const response = await client.messages.create({
119
+ model: 'claude-sonnet-4-6',
120
+ max_tokens: 2048,
121
+ system: SINGLE_DOC_SYSTEM_PROMPT,
122
+ messages: [{ role: 'user', content: userContent }]
123
+ });
124
+ const rawText = response.content[0]?.type === 'text' ? response.content[0].text.trim() : '';
125
+ const jsonMatch = /\{[\s\S]*\}/.exec(rawText);
126
+ if (!jsonMatch) {
127
+ throw new Error('Claude returned no parseable JSON for document assessment');
128
+ }
129
+ const parsed = JSON.parse(jsonMatch[0]);
130
+ parsed.verdict = verdictFromRaw(String(parsed.verdict));
131
+ return parsed;
132
+ }
133
+ export async function callClaudeForPackage(documents) {
134
+ const client = new Anthropic({ apiKey: process.env.ANTHROPIC_API_KEY });
135
+ const userContent = [
136
+ {
137
+ type: 'text',
138
+ text: `Assess the following ${documents.length} documents individually and cross-check them for consistency.`
139
+ }
140
+ ];
141
+ for (const doc of documents) {
142
+ userContent.push({
143
+ type: 'text',
144
+ text: `\n--- Document label: ${doc.label}${doc.document_type_hint ? ` | Type hint: ${doc.document_type_hint}` : ''}${doc.issuing_jurisdiction ? ` | Jurisdiction: ${doc.issuing_jurisdiction}` : ''} ---`
145
+ });
146
+ if (doc.document_image) {
147
+ userContent.push(buildImageBlock(doc.document_image));
148
+ }
149
+ if (doc.document_text) {
150
+ userContent.push({
151
+ type: 'text',
152
+ text: `Text content:\n${doc.document_text}`
153
+ });
154
+ }
155
+ if (!doc.document_image && !doc.document_text) {
156
+ userContent.push({
157
+ type: 'text',
158
+ text: '(No document content provided for this item)'
159
+ });
160
+ }
161
+ }
162
+ userContent.push({
163
+ type: 'text',
164
+ text: '\nAssess each document individually then cross-check all for consistency. Respond with JSON only.'
165
+ });
166
+ const response = await client.messages.create({
167
+ model: 'claude-sonnet-4-6',
168
+ max_tokens: 8192,
169
+ system: PACKAGE_SYSTEM_PROMPT,
170
+ messages: [{ role: 'user', content: userContent }]
171
+ });
172
+ const rawText = response.content[0]?.type === 'text' ? response.content[0].text.trim() : '';
173
+ const jsonMatch = /\{[\s\S]*\}/.exec(rawText);
174
+ if (!jsonMatch) {
175
+ throw new Error('Claude returned no parseable JSON for package assessment');
176
+ }
177
+ const parsed = JSON.parse(jsonMatch[0]);
178
+ parsed.package_verdict = verdictFromRaw(String(parsed.package_verdict));
179
+ if (Array.isArray(parsed.documents)) {
180
+ for (const d of parsed.documents) {
181
+ d.verdict = verdictFromRaw(String(d.verdict));
182
+ }
183
+ }
184
+ return parsed;
185
+ }
186
+ //# sourceMappingURL=claude.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/services/claude.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../src/tools/check.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EACV,WAAW,EACX,OAAO,EAEP,uBAAuB,EACvB,KAAK,EACN,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAE9D,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,WAAW,CAOlE;AAED,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,MAAM,CAGlE;AAOD,wBAAgB,uBAAuB,CACrC,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,KAAK,GACX,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAsCzB;AAED,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,kBAAkB,EAC1B,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,OAAO,EACb,KAAK,EAAE,KAAK,GACX,OAAO,CACN;IAAE,MAAM,EAAE,uBAAuB,CAAC;IAAC,KAAK,EAAE,IAAI,CAAA;CAAE,GAChD;IAAE,MAAM,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CACnD,CAwEA"}
@@ -0,0 +1,125 @@
1
+ import { callClaudeForDocument } from '../services/claude.js';
2
+ import { LEGAL_DISCLAIMER, nowISO, FREE_TIER_LIMIT, FREE_TIER_WARNING, TRIAL_EXTENSION_CALLS, PRO_UPGRADE_URL } from '../constants.js';
3
+ export function verdictToAgentAction(verdict) {
4
+ switch (verdict) {
5
+ case 'PASS': return 'PROCEED';
6
+ case 'FLAG': return 'VERIFY_MANUALLY';
7
+ case 'FAIL': return 'HOLD';
8
+ case 'UNKNOWN_DOCUMENT_TYPE': return 'REFER_TO_HUMAN';
9
+ }
10
+ }
11
+ export function getEffectiveLimit(ip, stats) {
12
+ const hasExtension = Object.values(stats.trial_extensions).some(ext => ext.ip === ip);
13
+ return hasExtension ? FREE_TIER_LIMIT + TRIAL_EXTENSION_CALLS : FREE_TIER_LIMIT;
14
+ }
15
+ function getCurrentMonthCalls(ip, stats) {
16
+ const month = new Date().toISOString().slice(0, 7);
17
+ return stats.free_tier_calls_by_ip[ip]?.[month] ?? 0;
18
+ }
19
+ export function buildFreeTierLimitError(ip, stats) {
20
+ const effectiveLimit = getEffectiveLimit(ip, stats);
21
+ return {
22
+ agent_action: 'UPGRADE_REQUIRED',
23
+ error: `Free tier limit of ${effectiveLimit} calls/month reached for this IP address.`,
24
+ limit_reached: true,
25
+ monthly_limit: effectiveLimit,
26
+ overage_rate: '$0.05 per additional call',
27
+ options: {
28
+ trial_extension: {
29
+ description: '10 extra free calls -- one per email address',
30
+ endpoint: '/trial-extension',
31
+ method: 'POST',
32
+ body: { name: 'string', email: 'string', use_case: 'string' }
33
+ },
34
+ overage: {
35
+ description: 'Continue immediately at $0.05 per call above your monthly cap',
36
+ contact: 'ojas@kordagencies.com'
37
+ },
38
+ pro: {
39
+ description: '500 calls/month',
40
+ price: '$29/month',
41
+ url: PRO_UPGRADE_URL
42
+ },
43
+ enterprise: {
44
+ description: '5,000 calls/month',
45
+ price: '$199/month',
46
+ url: PRO_UPGRADE_URL
47
+ }
48
+ },
49
+ trial_extension: {
50
+ endpoint: '/trial-extension',
51
+ method: 'POST',
52
+ body: { name: 'string', email: 'string', use_case: 'string' }
53
+ },
54
+ upgrade_url: PRO_UPGRADE_URL,
55
+ _disclaimer: LEGAL_DISCLAIMER
56
+ };
57
+ }
58
+ export async function runCheckDocument(params, ip, paid, stats) {
59
+ if (!params.document_text && !params.document_image) {
60
+ return {
61
+ output: null,
62
+ error: {
63
+ agent_action: 'REFER_TO_HUMAN',
64
+ error: 'At least one of document_text or document_image must be provided.',
65
+ likely_cause: 'Both document_text and document_image are absent from the request.',
66
+ agent_instruction: 'Retry the call with document_text set to the extracted document text, or document_image set to a base64 encoded image of the document.',
67
+ _disclaimer: LEGAL_DISCLAIMER
68
+ }
69
+ };
70
+ }
71
+ if (!paid) {
72
+ const effectiveLimit = getEffectiveLimit(ip, stats);
73
+ const used = getCurrentMonthCalls(ip, stats);
74
+ if (used >= effectiveLimit) {
75
+ return { output: null, error: buildFreeTierLimitError(ip, stats) };
76
+ }
77
+ }
78
+ let claudeResult;
79
+ try {
80
+ claudeResult = await callClaudeForDocument({
81
+ documentText: params.document_text,
82
+ documentImage: params.document_image,
83
+ documentTypeHint: params.document_type_hint,
84
+ issuingJurisdiction: params.issuing_jurisdiction
85
+ });
86
+ }
87
+ catch (err) {
88
+ const msg = err instanceof Error ? err.message : String(err);
89
+ return {
90
+ output: null,
91
+ error: {
92
+ agent_action: 'REFER_TO_HUMAN',
93
+ error: 'Document analysis failed.',
94
+ likely_cause: msg,
95
+ agent_instruction: 'Retry once. If the error persists contact support at ojas@kordagencies.com.',
96
+ retryable: true,
97
+ _disclaimer: LEGAL_DISCLAIMER
98
+ }
99
+ };
100
+ }
101
+ const agentAction = verdictToAgentAction(claudeResult.verdict);
102
+ const effectiveLimit = getEffectiveLimit(ip, stats);
103
+ const usedAfter = getCurrentMonthCalls(ip, stats) + (paid ? 0 : 1);
104
+ const remaining = Math.max(0, effectiveLimit - usedAfter);
105
+ const output = {
106
+ agent_action: agentAction,
107
+ verdict: claudeResult.verdict,
108
+ confidence: (claudeResult.confidence ?? 'NONE'),
109
+ document_type_identified: claudeResult.document_type_identified ?? null,
110
+ assessed_against: claudeResult.assessed_against ?? null,
111
+ known_issuing_standard: claudeResult.known_issuing_standard ?? null,
112
+ flags: Array.isArray(claudeResult.flags) ? claudeResult.flags : [],
113
+ reason: claudeResult.reason ?? '',
114
+ analysis_type: 'AI-powered reasoning -- NOT a database lookup',
115
+ checked_at: nowISO(),
116
+ _disclaimer: LEGAL_DISCLAIMER
117
+ };
118
+ if (!paid && remaining <= FREE_TIER_LIMIT - FREE_TIER_WARNING) {
119
+ output._upgrade_notice =
120
+ `${remaining} of ${effectiveLimit} free calls remaining this month. ` +
121
+ `Upgrade to Pro (500 calls/$29) at ${PRO_UPGRADE_URL}.`;
122
+ }
123
+ return { output, error: null };
124
+ }
125
+ //# sourceMappingURL=check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/tools/check.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-check.d.ts","sourceRoot":"","sources":["../../src/tools/package-check.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAIV,sBAAsB,EAEvB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AAG7E,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,yBAAyB,GAChC,OAAO,CACN;IAAE,MAAM,EAAE,sBAAsB,CAAC;IAAC,KAAK,EAAE,IAAI,CAAA;CAAE,GAC/C;IAAE,MAAM,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CACnD,CAoFA;AAED,wBAAgB,yBAAyB,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAcnE"}
@@ -0,0 +1,100 @@
1
+ import { callClaudeForPackage } from '../services/claude.js';
2
+ import { LEGAL_DISCLAIMER, nowISO, PRO_UPGRADE_URL } from '../constants.js';
3
+ import { verdictToAgentAction } from './check.js';
4
+ export async function runCheckDocumentPackage(params) {
5
+ for (const doc of params.documents) {
6
+ if (!doc.document_text && !doc.document_image) {
7
+ return {
8
+ output: null,
9
+ error: {
10
+ agent_action: 'REFER_TO_HUMAN',
11
+ error: `Document with label "${doc.label}" has neither document_text nor document_image. Each document must have at least one.`,
12
+ likely_cause: 'A document item in the package array is missing both content fields.',
13
+ agent_instruction: 'Ensure every document in the documents array has at least document_text or document_image set.',
14
+ _disclaimer: LEGAL_DISCLAIMER
15
+ }
16
+ };
17
+ }
18
+ }
19
+ let claudeResult;
20
+ try {
21
+ claudeResult = await callClaudeForPackage(params.documents);
22
+ }
23
+ catch (err) {
24
+ const msg = err instanceof Error ? err.message : String(err);
25
+ return {
26
+ output: null,
27
+ error: {
28
+ agent_action: 'REFER_TO_HUMAN',
29
+ error: 'Package document analysis failed.',
30
+ likely_cause: msg,
31
+ agent_instruction: 'Retry once. If the error persists contact support at ojas@kordagencies.com.',
32
+ retryable: true,
33
+ _disclaimer: LEGAL_DISCLAIMER
34
+ }
35
+ };
36
+ }
37
+ const packageAgentAction = verdictToAgentAction(claudeResult.package_verdict);
38
+ const overallVerdicts = claudeResult.documents.map(d => d.verdict);
39
+ let overallVerdict = claudeResult.package_verdict;
40
+ if (overallVerdicts.includes('FAIL'))
41
+ overallVerdict = 'FAIL';
42
+ else if (overallVerdicts.includes('FLAG'))
43
+ overallVerdict = 'FLAG';
44
+ else if (overallVerdicts.includes('UNKNOWN_DOCUMENT_TYPE'))
45
+ overallVerdict = 'FLAG';
46
+ else
47
+ overallVerdict = claudeResult.package_verdict;
48
+ const topLevelAgentAction = verdictToAgentAction(overallVerdict);
49
+ const documents = claudeResult.documents.map(d => ({
50
+ label: d.label,
51
+ agent_action: verdictToAgentAction(d.verdict),
52
+ verdict: d.verdict,
53
+ confidence: (d.confidence ?? 'NONE'),
54
+ document_type_identified: d.document_type_identified ?? null,
55
+ assessed_against: d.assessed_against ?? null,
56
+ known_issuing_standard: d.known_issuing_standard ?? null,
57
+ flags: Array.isArray(d.flags) ? d.flags : [],
58
+ reason: d.reason ?? ''
59
+ }));
60
+ const worstConfidence = () => {
61
+ const order = ['NONE', 'LOW', 'MEDIUM', 'HIGH'];
62
+ let worst = 'HIGH';
63
+ for (const d of documents) {
64
+ const rank = order.indexOf(d.confidence);
65
+ if (rank < order.indexOf(worst))
66
+ worst = d.confidence;
67
+ }
68
+ return worst;
69
+ };
70
+ const output = {
71
+ agent_action: topLevelAgentAction,
72
+ verdict: overallVerdict,
73
+ confidence: worstConfidence(),
74
+ documents,
75
+ cross_document_conflicts: Array.isArray(claudeResult.cross_document_conflicts)
76
+ ? claudeResult.cross_document_conflicts
77
+ : [],
78
+ package_verdict: claudeResult.package_verdict,
79
+ package_agent_action: packageAgentAction,
80
+ analysis_type: 'AI-powered reasoning -- NOT a database lookup',
81
+ checked_at: nowISO(),
82
+ _disclaimer: LEGAL_DISCLAIMER
83
+ };
84
+ return { output, error: null };
85
+ }
86
+ export function buildPackagePaidOnlyError() {
87
+ return {
88
+ agent_action: 'UPGRADE_REQUIRED',
89
+ error: 'Pro API key required. check_document_package has no free tier.',
90
+ likely_cause: 'No valid x-api-key header was provided.',
91
+ agent_instruction: `Inform the user that check_document_package requires a Pro or Enterprise subscription. ` +
92
+ `Pro: 500 calls/month at $29/month. Enterprise: 5,000 calls/month at $199/month. ` +
93
+ `Subscribe at ${PRO_UPGRADE_URL}.`,
94
+ upgrade_url: PRO_UPGRADE_URL,
95
+ fallback_tool: 'check_document',
96
+ retryable: false,
97
+ _disclaimer: LEGAL_DISCLAIMER
98
+ };
99
+ }
100
+ //# sourceMappingURL=package-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-check.js","sourceRoot":"","sources":["../../src/tools/package-check.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,42 @@
1
+ {
2
+ "name": "document-integrity-validator-mcp",
3
+ "version": "1.0.2",
4
+ "description": "MCP server that checks any document against its international standard before your agent acts on it.",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "license": "UNLICENSED",
8
+ "homepage": "https://kordagencies.com",
9
+ "mcpName": "io.github.OjasKord/document-integrity-validator-mcp",
10
+ "keywords": [
11
+ "mcp",
12
+ "agent",
13
+ "document",
14
+ "validator",
15
+ "integrity",
16
+ "compliance",
17
+ "kyc",
18
+ "trade"
19
+ ],
20
+ "scripts": {
21
+ "start": "node dist/index.js",
22
+ "dev": "tsx watch src/index.ts",
23
+ "build": "tsc",
24
+ "clean": "rm -rf dist"
25
+ },
26
+ "engines": {
27
+ "node": ">=18"
28
+ },
29
+ "dependencies": {
30
+ "@anthropic-ai/sdk": "^0.39.0",
31
+ "@modelcontextprotocol/sdk": "^1.6.1",
32
+ "axios": "^1.7.9",
33
+ "express": "^4.18.2",
34
+ "zod": "^3.23.8"
35
+ },
36
+ "devDependencies": {
37
+ "@types/express": "^4.17.21",
38
+ "@types/node": "^22.10.0",
39
+ "tsx": "^4.19.2",
40
+ "typescript": "^5.7.2"
41
+ }
42
+ }