agent-passport-system-mcp 2.4.3 → 2.4.4
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/README.md +36 -3
- package/build/index.js +160 -1
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -1,12 +1,33 @@
|
|
|
1
1
|
# Agent Passport System MCP Server
|
|
2
2
|
|
|
3
|
+
<!-- mcp-name: io.github.aeoess/agent-passport-mcp -->
|
|
4
|
+
|
|
5
|
+
<a href="https://glama.ai/mcp/servers/@aeoess/agent-passport-system-mcp">
|
|
6
|
+
<img width="380" height="200" src="https://glama.ai/mcp/servers/@aeoess/agent-passport-system-mcp/badge" />
|
|
7
|
+
</a>
|
|
8
|
+
|
|
3
9
|
MCP server for the [Agent Passport System](https://github.com/aeoess/agent-passport-system) — cryptographic identity, delegation, governance, and commerce for AI agents.
|
|
4
10
|
|
|
5
|
-
**
|
|
11
|
+
**44 tools** across all 8 protocol layers. Works with any MCP client: Claude Desktop, Cursor, Windsurf, and more.
|
|
6
12
|
|
|
7
13
|
## Quick Start
|
|
8
14
|
|
|
9
|
-
###
|
|
15
|
+
### Remote (no install)
|
|
16
|
+
|
|
17
|
+
Connect directly via SSE — works with any MCP client:
|
|
18
|
+
|
|
19
|
+
```json
|
|
20
|
+
{
|
|
21
|
+
"mcpServers": {
|
|
22
|
+
"agent-passport": {
|
|
23
|
+
"type": "sse",
|
|
24
|
+
"url": "https://mcp.aeoess.com/sse"
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
### Claude Desktop (local)
|
|
10
31
|
|
|
11
32
|
Add to `~/Library/Application Support/Claude/claude_desktop_config.json`:
|
|
12
33
|
|
|
@@ -116,6 +137,17 @@ Add to your MCP config:
|
|
|
116
137
|
| `execute_with_context` | Execute action through policy enforcement (intent → evaluate → verdict) |
|
|
117
138
|
| `complete_action` | Complete action and get full proof chain (intent + decision + receipt) |
|
|
118
139
|
|
|
140
|
+
### Principal Identity — 6 tools
|
|
141
|
+
|
|
142
|
+
| Tool | Description |
|
|
143
|
+
|------|-------------|
|
|
144
|
+
| `create_principal` | Create principal identity (human/org behind agents) with Ed25519 keypair |
|
|
145
|
+
| `endorse_agent` | Endorse an agent — cryptographic chain: principal → agent |
|
|
146
|
+
| `verify_endorsement` | Verify a principal's endorsement signature |
|
|
147
|
+
| `revoke_endorsement` | Revoke endorsement ("I no longer authorize this agent") |
|
|
148
|
+
| `create_disclosure` | Selective disclosure of principal identity (public/verified-only/minimal) |
|
|
149
|
+
| `get_fleet_status` | Status of all agents endorsed by the current principal |
|
|
150
|
+
|
|
119
151
|
## Architecture
|
|
120
152
|
|
|
121
153
|
```
|
|
@@ -131,7 +163,8 @@ Layer 1 — Agent Passport Protocol (Ed25519 identity)
|
|
|
131
163
|
|
|
132
164
|
## Links
|
|
133
165
|
|
|
134
|
-
- npm SDK: [agent-passport-system](https://www.npmjs.com/package/agent-passport-system) (v1.
|
|
166
|
+
- npm SDK: [agent-passport-system](https://www.npmjs.com/package/agent-passport-system) (v1.10.1, 329 tests)
|
|
167
|
+
- Python SDK: [agent-passport-system](https://pypi.org/project/agent-passport-system/) (v0.4.0, 86 tests)
|
|
135
168
|
- Paper: [doi.org/10.5281/zenodo.18749779](https://doi.org/10.5281/zenodo.18749779)
|
|
136
169
|
- Docs: [aeoess.com/llms-full.txt](https://aeoess.com/llms-full.txt)
|
|
137
170
|
- Agora: [aeoess.com/agora.html](https://aeoess.com/agora.html)
|
package/build/index.js
CHANGED
|
@@ -29,7 +29,9 @@ createAgoraMessage, createFeed, appendToFeed, getThread, getByTopic, getTopics,
|
|
|
29
29
|
// Values/Policy (Layer 2 + 5)
|
|
30
30
|
loadFloor, attestFloor, createActionIntent, evaluateIntent, FloorValidatorV1,
|
|
31
31
|
// Commerce (Layer 8)
|
|
32
|
-
commercePreflight, createCommerceDelegation, getSpendSummary, requestHumanApproval, coordinationToAgora,
|
|
32
|
+
commercePreflight, createCommerceDelegation, getSpendSummary, requestHumanApproval, coordinationToAgora,
|
|
33
|
+
// Principal Identity
|
|
34
|
+
createPrincipalIdentity, endorseAgent, verifyEndorsement, revokeEndorsement, createDisclosure, createFleet, addToFleet, getFleetStatus, revokeFromFleet, } from "agent-passport-system";
|
|
33
35
|
// ═══════════════════════════════════════
|
|
34
36
|
// State Management
|
|
35
37
|
// ═══════════════════════════════════════
|
|
@@ -54,6 +56,10 @@ const state = {
|
|
|
54
56
|
agentContext: null,
|
|
55
57
|
floor: null,
|
|
56
58
|
pendingActions: new Map(),
|
|
59
|
+
principal: null,
|
|
60
|
+
principalPrivateKey: null,
|
|
61
|
+
endorsements: new Map(),
|
|
62
|
+
fleet: null,
|
|
57
63
|
};
|
|
58
64
|
// Load persisted task state
|
|
59
65
|
function loadTasks() {
|
|
@@ -1761,6 +1767,159 @@ server.tool("complete_action", "Complete a permitted action and get the full 3-s
|
|
|
1761
1767
|
}
|
|
1762
1768
|
});
|
|
1763
1769
|
// ═══════════════════════════════════════
|
|
1770
|
+
// PRINCIPAL IDENTITY TOOLS
|
|
1771
|
+
// ═══════════════════════════════════════
|
|
1772
|
+
server.tool("create_principal", "Create a principal identity (human or org behind agents). Gets its own Ed25519 keypair.", {
|
|
1773
|
+
display_name: z.string().describe("Human-readable name (e.g. 'Tima', 'Acme Corp')"),
|
|
1774
|
+
domain: z.string().optional().describe("Verifiable domain (e.g. 'aeoess.com')"),
|
|
1775
|
+
jurisdiction: z.string().optional().describe("Legal jurisdiction (e.g. 'US', 'EU')"),
|
|
1776
|
+
contact_channel: z.string().optional().describe("Contact method (e.g. 'telegram:@aeoess')"),
|
|
1777
|
+
disclosure_level: z.enum(["public", "verified-only", "minimal"]).default("public").describe("How much identity to reveal"),
|
|
1778
|
+
}, async (args) => {
|
|
1779
|
+
const { principal, keyPair } = createPrincipalIdentity({
|
|
1780
|
+
displayName: args.display_name,
|
|
1781
|
+
domain: args.domain,
|
|
1782
|
+
jurisdiction: args.jurisdiction,
|
|
1783
|
+
contactChannel: args.contact_channel,
|
|
1784
|
+
disclosureLevel: args.disclosure_level,
|
|
1785
|
+
});
|
|
1786
|
+
state.principal = principal;
|
|
1787
|
+
state.principalPrivateKey = keyPair.privateKey;
|
|
1788
|
+
state.fleet = createFleet(principal);
|
|
1789
|
+
return {
|
|
1790
|
+
content: [{
|
|
1791
|
+
type: "text",
|
|
1792
|
+
text: JSON.stringify({
|
|
1793
|
+
principalId: principal.principalId,
|
|
1794
|
+
displayName: principal.displayName,
|
|
1795
|
+
publicKey: principal.publicKey.slice(0, 16) + '...',
|
|
1796
|
+
privateKey: keyPair.privateKey.slice(0, 16) + '... (store securely)',
|
|
1797
|
+
domain: principal.domain,
|
|
1798
|
+
disclosureLevel: principal.disclosureLevel,
|
|
1799
|
+
note: 'Principal created. Use endorse_agent to sign off on agents.',
|
|
1800
|
+
}, null, 2),
|
|
1801
|
+
}],
|
|
1802
|
+
};
|
|
1803
|
+
});
|
|
1804
|
+
server.tool("endorse_agent", "Endorse an agent as a principal. Creates a cryptographic chain: principal → agent.", {
|
|
1805
|
+
agent_id: z.string().describe("Agent ID to endorse"),
|
|
1806
|
+
agent_public_key: z.string().describe("Agent's Ed25519 public key"),
|
|
1807
|
+
scope: z.array(z.string()).describe("What the agent can do on principal's behalf"),
|
|
1808
|
+
relationship: z.enum(["creator", "operator", "employer", "sponsor"]).describe("How principal relates to agent"),
|
|
1809
|
+
expires_in_days: z.number().default(365).describe("Days until endorsement expires"),
|
|
1810
|
+
}, async (args) => {
|
|
1811
|
+
if (!state.principal || !state.principalPrivateKey) {
|
|
1812
|
+
return { content: [{ type: "text", text: 'No principal identity. Call create_principal first.' }], isError: true };
|
|
1813
|
+
}
|
|
1814
|
+
const endorsement = endorseAgent({
|
|
1815
|
+
principal: state.principal,
|
|
1816
|
+
principalPrivateKey: state.principalPrivateKey,
|
|
1817
|
+
agentId: args.agent_id,
|
|
1818
|
+
agentPublicKey: args.agent_public_key,
|
|
1819
|
+
scope: args.scope,
|
|
1820
|
+
relationship: args.relationship,
|
|
1821
|
+
expiresInDays: args.expires_in_days,
|
|
1822
|
+
});
|
|
1823
|
+
state.endorsements.set(endorsement.endorsementId, endorsement);
|
|
1824
|
+
if (state.fleet) {
|
|
1825
|
+
state.fleet = addToFleet(state.fleet, endorsement);
|
|
1826
|
+
}
|
|
1827
|
+
return {
|
|
1828
|
+
content: [{
|
|
1829
|
+
type: "text",
|
|
1830
|
+
text: JSON.stringify({
|
|
1831
|
+
endorsementId: endorsement.endorsementId,
|
|
1832
|
+
principalId: endorsement.principalId,
|
|
1833
|
+
agentId: endorsement.agentId,
|
|
1834
|
+
relationship: endorsement.relationship,
|
|
1835
|
+
scope: endorsement.scope,
|
|
1836
|
+
expiresAt: endorsement.expiresAt,
|
|
1837
|
+
note: 'Agent endorsed. The endorsement signature can be embedded in the agent\'s passport via endorse_passport.',
|
|
1838
|
+
}, null, 2),
|
|
1839
|
+
}],
|
|
1840
|
+
};
|
|
1841
|
+
});
|
|
1842
|
+
server.tool("verify_endorsement", "Verify a principal's endorsement of an agent. Checks cryptographic signature.", {
|
|
1843
|
+
endorsement_id: z.string().describe("Endorsement ID to verify"),
|
|
1844
|
+
}, async (args) => {
|
|
1845
|
+
const endorsement = state.endorsements.get(args.endorsement_id);
|
|
1846
|
+
if (!endorsement) {
|
|
1847
|
+
return { content: [{ type: "text", text: `Endorsement ${args.endorsement_id} not found in session.` }], isError: true };
|
|
1848
|
+
}
|
|
1849
|
+
const result = verifyEndorsement(endorsement);
|
|
1850
|
+
return {
|
|
1851
|
+
content: [{
|
|
1852
|
+
type: "text",
|
|
1853
|
+
text: JSON.stringify({
|
|
1854
|
+
valid: result.valid,
|
|
1855
|
+
expired: result.expired,
|
|
1856
|
+
revoked: result.revoked,
|
|
1857
|
+
principalId: result.principalId,
|
|
1858
|
+
agentId: result.agentId,
|
|
1859
|
+
errors: result.errors,
|
|
1860
|
+
}, null, 2),
|
|
1861
|
+
}],
|
|
1862
|
+
};
|
|
1863
|
+
});
|
|
1864
|
+
server.tool("revoke_endorsement", "Revoke a principal's endorsement of an agent. 'I no longer authorize this agent.'", {
|
|
1865
|
+
endorsement_id: z.string().describe("Endorsement ID to revoke"),
|
|
1866
|
+
reason: z.string().describe("Why the endorsement is being revoked"),
|
|
1867
|
+
}, async (args) => {
|
|
1868
|
+
const endorsement = state.endorsements.get(args.endorsement_id);
|
|
1869
|
+
if (!endorsement) {
|
|
1870
|
+
return { content: [{ type: "text", text: `Endorsement ${args.endorsement_id} not found.` }], isError: true };
|
|
1871
|
+
}
|
|
1872
|
+
const revoked = revokeEndorsement(endorsement, args.reason);
|
|
1873
|
+
state.endorsements.set(args.endorsement_id, revoked);
|
|
1874
|
+
if (state.fleet) {
|
|
1875
|
+
state.fleet = revokeFromFleet(state.fleet, revoked.agentId);
|
|
1876
|
+
}
|
|
1877
|
+
return {
|
|
1878
|
+
content: [{
|
|
1879
|
+
type: "text",
|
|
1880
|
+
text: JSON.stringify({
|
|
1881
|
+
revoked: true,
|
|
1882
|
+
endorsementId: revoked.endorsementId,
|
|
1883
|
+
agentId: revoked.agentId,
|
|
1884
|
+
reason: revoked.revokedReason,
|
|
1885
|
+
revokedAt: revoked.revokedAt,
|
|
1886
|
+
}, null, 2),
|
|
1887
|
+
}],
|
|
1888
|
+
};
|
|
1889
|
+
});
|
|
1890
|
+
server.tool("create_disclosure", "Create a selective disclosure of principal identity. Controls how much info is revealed.", {
|
|
1891
|
+
level: z.enum(["public", "verified-only", "minimal"]).describe("Disclosure level: public (everything), verified-only (id+key+domain), minimal (hash+DID only)"),
|
|
1892
|
+
}, async (args) => {
|
|
1893
|
+
if (!state.principal || !state.principalPrivateKey) {
|
|
1894
|
+
return { content: [{ type: "text", text: 'No principal identity. Call create_principal first.' }], isError: true };
|
|
1895
|
+
}
|
|
1896
|
+
const disclosure = createDisclosure(state.principal, state.principalPrivateKey, args.level);
|
|
1897
|
+
return {
|
|
1898
|
+
content: [{
|
|
1899
|
+
type: "text",
|
|
1900
|
+
text: JSON.stringify({
|
|
1901
|
+
disclosureId: disclosure.disclosureId,
|
|
1902
|
+
level: disclosure.level,
|
|
1903
|
+
revealedFields: disclosure.revealedFields,
|
|
1904
|
+
proof: disclosure.proof.slice(0, 16) + '...',
|
|
1905
|
+
note: 'Share this disclosure with other agents. They can verify it with verify_disclosure.',
|
|
1906
|
+
}, null, 2),
|
|
1907
|
+
}],
|
|
1908
|
+
};
|
|
1909
|
+
});
|
|
1910
|
+
server.tool("get_fleet_status", "Get status of all agents endorsed by the current principal.", {}, async () => {
|
|
1911
|
+
if (!state.fleet) {
|
|
1912
|
+
return { content: [{ type: "text", text: 'No fleet. Call create_principal first.' }], isError: true };
|
|
1913
|
+
}
|
|
1914
|
+
const status = getFleetStatus(state.fleet);
|
|
1915
|
+
return {
|
|
1916
|
+
content: [{
|
|
1917
|
+
type: "text",
|
|
1918
|
+
text: JSON.stringify(status, null, 2),
|
|
1919
|
+
}],
|
|
1920
|
+
};
|
|
1921
|
+
});
|
|
1922
|
+
// ═══════════════════════════════════════
|
|
1764
1923
|
// MCP Prompts — Role-Specific
|
|
1765
1924
|
// ═══════════════════════════════════════
|
|
1766
1925
|
server.prompt("coordination_role", "Get instructions for your assigned coordination role", {}, async () => {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agent-passport-system-mcp",
|
|
3
|
-
"version": "2.4.
|
|
3
|
+
"version": "2.4.4",
|
|
4
4
|
"mcpName": "io.github.aeoess/agent-passport-mcp",
|
|
5
5
|
"description": "MCP server for Agent Passport System — cryptographic identity, delegation, governance, and deliberation for AI agents",
|
|
6
6
|
"type": "module",
|
|
@@ -45,11 +45,11 @@
|
|
|
45
45
|
"homepage": "https://github.com/aeoess/agent-passport-mcp",
|
|
46
46
|
"dependencies": {
|
|
47
47
|
"@modelcontextprotocol/sdk": "^1.12.0",
|
|
48
|
-
"agent-passport-system": "
|
|
48
|
+
"agent-passport-system": "file:../agent-passport-system/agent-passport-system-1.10.1.tgz",
|
|
49
49
|
"zod": "^3.25.0"
|
|
50
50
|
},
|
|
51
51
|
"devDependencies": {
|
|
52
|
-
"@types/node": "^25.3.
|
|
52
|
+
"@types/node": "^25.3.5",
|
|
53
53
|
"typescript": "^5.9.3"
|
|
54
54
|
},
|
|
55
55
|
"peerDependencies": {
|