agentscore-mcp 1.0.3

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.
Files changed (123) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +404 -0
  3. package/dist/adapters/demo/adapter.d.ts +22 -0
  4. package/dist/adapters/demo/adapter.d.ts.map +1 -0
  5. package/dist/adapters/demo/adapter.js +67 -0
  6. package/dist/adapters/demo/adapter.js.map +1 -0
  7. package/dist/adapters/demo/agents.d.ts +19 -0
  8. package/dist/adapters/demo/agents.d.ts.map +1 -0
  9. package/dist/adapters/demo/agents.js +480 -0
  10. package/dist/adapters/demo/agents.js.map +1 -0
  11. package/dist/adapters/github/adapter.d.ts +15 -0
  12. package/dist/adapters/github/adapter.d.ts.map +1 -0
  13. package/dist/adapters/github/adapter.js +75 -0
  14. package/dist/adapters/github/adapter.js.map +1 -0
  15. package/dist/adapters/github/client.d.ts +22 -0
  16. package/dist/adapters/github/client.d.ts.map +1 -0
  17. package/dist/adapters/github/client.js +220 -0
  18. package/dist/adapters/github/client.js.map +1 -0
  19. package/dist/adapters/github/mapper.d.ts +18 -0
  20. package/dist/adapters/github/mapper.d.ts.map +1 -0
  21. package/dist/adapters/github/mapper.js +132 -0
  22. package/dist/adapters/github/mapper.js.map +1 -0
  23. package/dist/adapters/github/types.d.ts +117 -0
  24. package/dist/adapters/github/types.d.ts.map +1 -0
  25. package/dist/adapters/github/types.js +3 -0
  26. package/dist/adapters/github/types.js.map +1 -0
  27. package/dist/adapters/json/adapter.d.ts +36 -0
  28. package/dist/adapters/json/adapter.d.ts.map +1 -0
  29. package/dist/adapters/json/adapter.js +149 -0
  30. package/dist/adapters/json/adapter.js.map +1 -0
  31. package/dist/adapters/moltbook/adapter.d.ts +18 -0
  32. package/dist/adapters/moltbook/adapter.d.ts.map +1 -0
  33. package/dist/adapters/moltbook/adapter.js +119 -0
  34. package/dist/adapters/moltbook/adapter.js.map +1 -0
  35. package/dist/adapters/moltbook/client.d.ts +14 -0
  36. package/dist/adapters/moltbook/client.d.ts.map +1 -0
  37. package/dist/adapters/moltbook/client.js +165 -0
  38. package/dist/adapters/moltbook/client.js.map +1 -0
  39. package/dist/adapters/moltbook/types.d.ts +57 -0
  40. package/dist/adapters/moltbook/types.d.ts.map +1 -0
  41. package/dist/adapters/moltbook/types.js +3 -0
  42. package/dist/adapters/moltbook/types.js.map +1 -0
  43. package/dist/adapters/types.d.ts +45 -0
  44. package/dist/adapters/types.d.ts.map +1 -0
  45. package/dist/adapters/types.js +2 -0
  46. package/dist/adapters/types.js.map +1 -0
  47. package/dist/cache/score-cache.d.ts +22 -0
  48. package/dist/cache/score-cache.d.ts.map +1 -0
  49. package/dist/cache/score-cache.js +48 -0
  50. package/dist/cache/score-cache.js.map +1 -0
  51. package/dist/config.d.ts +15 -0
  52. package/dist/config.d.ts.map +1 -0
  53. package/dist/config.js +72 -0
  54. package/dist/config.js.map +1 -0
  55. package/dist/scoring/briefing.d.ts +5 -0
  56. package/dist/scoring/briefing.d.ts.map +1 -0
  57. package/dist/scoring/briefing.js +124 -0
  58. package/dist/scoring/briefing.js.map +1 -0
  59. package/dist/scoring/categories/account-health.d.ts +4 -0
  60. package/dist/scoring/categories/account-health.d.ts.map +1 -0
  61. package/dist/scoring/categories/account-health.js +67 -0
  62. package/dist/scoring/categories/account-health.js.map +1 -0
  63. package/dist/scoring/categories/behavioral-consistency.d.ts +4 -0
  64. package/dist/scoring/categories/behavioral-consistency.d.ts.map +1 -0
  65. package/dist/scoring/categories/behavioral-consistency.js +66 -0
  66. package/dist/scoring/categories/behavioral-consistency.js.map +1 -0
  67. package/dist/scoring/categories/community-standing.d.ts +4 -0
  68. package/dist/scoring/categories/community-standing.d.ts.map +1 -0
  69. package/dist/scoring/categories/community-standing.js +45 -0
  70. package/dist/scoring/categories/community-standing.js.map +1 -0
  71. package/dist/scoring/categories/content-quality.d.ts +4 -0
  72. package/dist/scoring/categories/content-quality.d.ts.map +1 -0
  73. package/dist/scoring/categories/content-quality.js +42 -0
  74. package/dist/scoring/categories/content-quality.js.map +1 -0
  75. package/dist/scoring/categories/interaction-quality.d.ts +4 -0
  76. package/dist/scoring/categories/interaction-quality.d.ts.map +1 -0
  77. package/dist/scoring/categories/interaction-quality.js +49 -0
  78. package/dist/scoring/categories/interaction-quality.js.map +1 -0
  79. package/dist/scoring/categories/risk-signals.d.ts +8 -0
  80. package/dist/scoring/categories/risk-signals.d.ts.map +1 -0
  81. package/dist/scoring/categories/risk-signals.js +69 -0
  82. package/dist/scoring/categories/risk-signals.js.map +1 -0
  83. package/dist/scoring/engine.d.ts +7 -0
  84. package/dist/scoring/engine.d.ts.map +1 -0
  85. package/dist/scoring/engine.js +165 -0
  86. package/dist/scoring/engine.js.map +1 -0
  87. package/dist/scoring/tiers.d.ts +11 -0
  88. package/dist/scoring/tiers.d.ts.map +1 -0
  89. package/dist/scoring/tiers.js +17 -0
  90. package/dist/scoring/tiers.js.map +1 -0
  91. package/dist/scoring/types.d.ts +39 -0
  92. package/dist/scoring/types.d.ts.map +1 -0
  93. package/dist/scoring/types.js +2 -0
  94. package/dist/scoring/types.js.map +1 -0
  95. package/dist/scoring/utils.d.ts +9 -0
  96. package/dist/scoring/utils.d.ts.map +1 -0
  97. package/dist/scoring/utils.js +48 -0
  98. package/dist/scoring/utils.js.map +1 -0
  99. package/dist/security/client-key.d.ts +6 -0
  100. package/dist/security/client-key.d.ts.map +1 -0
  101. package/dist/security/client-key.js +42 -0
  102. package/dist/security/client-key.js.map +1 -0
  103. package/dist/security/rate-limiter.d.ts +24 -0
  104. package/dist/security/rate-limiter.d.ts.map +1 -0
  105. package/dist/security/rate-limiter.js +47 -0
  106. package/dist/security/rate-limiter.js.map +1 -0
  107. package/dist/server.d.ts +3 -0
  108. package/dist/server.d.ts.map +1 -0
  109. package/dist/server.js +83 -0
  110. package/dist/server.js.map +1 -0
  111. package/dist/tools/agentscore.d.ts +5 -0
  112. package/dist/tools/agentscore.d.ts.map +1 -0
  113. package/dist/tools/agentscore.js +149 -0
  114. package/dist/tools/agentscore.js.map +1 -0
  115. package/dist/tools/sweep.d.ts +5 -0
  116. package/dist/tools/sweep.d.ts.map +1 -0
  117. package/dist/tools/sweep.js +280 -0
  118. package/dist/tools/sweep.js.map +1 -0
  119. package/dist/version.d.ts +2 -0
  120. package/dist/version.d.ts.map +1 -0
  121. package/dist/version.js +2 -0
  122. package/dist/version.js.map +1 -0
  123. package/package.json +58 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Tripti Mishra
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,404 @@
1
+ <p align="center">
2
+ <picture>
3
+ <source media="(prefers-color-scheme: dark)" srcset="https://img.shields.io/badge/AgentScore-Trust_Layer_for_AI_Agents-00E68A?style=for-the-badge&labelColor=0D1117">
4
+ <img alt="AgentScore" src="https://img.shields.io/badge/AgentScore-Trust_Layer_for_AI_Agents-00E68A?style=for-the-badge&labelColor=0D1117">
5
+ </picture>
6
+ </p>
7
+
8
+ <p align="center">
9
+ <a href="https://npmjs.com/package/agentscore-mcp"><img src="https://img.shields.io/npm/v/agentscore-mcp?color=00E68A&label=npm" alt="npm"></a>
10
+ <a href="LICENSE"><img src="https://img.shields.io/badge/License-MIT-blue.svg" alt="MIT"></a>
11
+ <a href="https://nodejs.org"><img src="https://img.shields.io/badge/node-%3E%3D18-brightgreen" alt="Node"></a>
12
+ <a href="https://img.shields.io/badge/dependencies-2-00AAFF"><img src="https://img.shields.io/badge/dependencies-2-00AAFF" alt="Dependencies"></a>
13
+ </p>
14
+
15
+ <p align="center">
16
+ <strong>Give your AI assistant the ability to investigate any agent's trustworthiness.</strong><br>
17
+ Two tools. Zero config. Just ask.
18
+ </p>
19
+
20
+ <p align="center">
21
+ <code>"Investigate @SupportBot — would you trust it with customer data?"</code><br>
22
+ <code>"Compare our 3 vendor bots — which one goes to production?"</code><br>
23
+ <code>"Is this thread being astroturfed? Sweep it."</code><br>
24
+ <code>"Score @torvalds on GitHub — is this account legit?"</code>
25
+ </p>
26
+
27
+ ---
28
+
29
+ ## Why This Exists
30
+
31
+ You're about to give AI agents access to customer data, source code, and critical workflows.
32
+ Most teams still have no shared way to answer: _is this agent trustworthy, drifting, or compromised?_
33
+ AgentScore gives your assistant a concrete trust signal before that agent gets real access.
34
+
35
+ Built in public from recurring conversations with AI governance teams asking one question: **"How do we know which agents to trust?"**
36
+
37
+ ---
38
+
39
+ ## Install in 10 Seconds
40
+
41
+ ```bash
42
+ claude mcp add agentscore -- npx -y agentscore-mcp
43
+ ```
44
+
45
+ Then ask Claude:
46
+
47
+ > _"Investigate @NovaMind — can I trust this agent?"_
48
+
49
+ No API keys. No config files. No databases. **Ships with 10 built-in demo agents** spanning every trust tier — from research AI to coordinated sock puppets. Connect real platforms (GitHub, Moltbook, your own data) whenever you're ready.
50
+
51
+ ---
52
+
53
+ ## What Makes AgentScore Different
54
+
55
+ `mcp-scan`-style tools answer: **"Is this MCP server vulnerable?"**
56
+ AgentScore answers: **"Is this agent trustworthy?"**
57
+
58
+ Think of it this way:
59
+ - Security scanners tell you the airplane passed inspection.
60
+ - AgentScore tells you whether you'd trust the pilot.
61
+
62
+ You need both.
63
+
64
+ ---
65
+
66
+ ## What You Get Back
67
+
68
+ You ask: _"Investigate @SpamBot3000"_
69
+
70
+ Claude pulls the agent's profile, analyzes posting patterns, checks for spam and prompt injection language, evaluates behavioral consistency — then writes you an intelligence briefing:
71
+
72
+ ```
73
+ ┌─────────────────────────────────────────────────────────────┐
74
+ │ @SpamBot3000 — 474/850 (Poor) │
75
+ │ Recommendation: CAUTION · Confidence: high │
76
+ ├─────────────────────────────────────────────────────────────┤
77
+ │ │
78
+ │ Multiple red flags. 13 manipulation keyword(s): buy now, │
79
+ │ limited time, act fast, guaranteed returns, free money. │
80
+ │ Negative karma. Account age under 7 days. Zero │
81
+ │ interactions. Recommend caution. │
82
+ │ │
83
+ │ Content Quality ····· 23/100 Majority negative reception │
84
+ │ Behavioral ·········· 62/100 Active within last 24 hours │
85
+ │ Interaction ········· 0/100 No interactions found │
86
+ │ Risk Signals ········ 55/100 13 manipulation keywords │
87
+ │ Account Health ······ 21/100 New account — only 3 days old │
88
+ │ Community ··········· 8/100 Limited community footprint │
89
+ │ │
90
+ │ Flags: manipulation_keywords · templated_content │
91
+ │ Badge: https://img.shields.io/badge/AgentScore-474%2F850-FF8C00 │
92
+ └─────────────────────────────────────────────────────────────┘
93
+ ```
94
+
95
+ That's not canned text. Every briefing is generated from real behavioral data. Every score is earned.
96
+
97
+ ---
98
+
99
+ ## Two Tools. Every Question.
100
+
101
+ | You Ask | Tool | What Happens |
102
+ |:---|:---:|:---|
103
+ | _"Investigate @NovaMind"_ | `agentscore` | Full investigation + narrative briefing |
104
+ | _"Compare @NovaMind vs @TrustPilot"_ | `agentscore` | Side-by-side with opinionated verdict |
105
+ | _"Give me a trust badge for @HelperBot"_ | `agentscore` | Shields.io badge URL, ready to embed |
106
+ | _"Sweep demo-thread-001 for sock puppets"_ | `sweep` | Thread-wide coordination + manipulation scan |
107
+ | _"Score @torvalds on GitHub"_ | `agentscore` | Live GitHub profile analysis |
108
+ | _"Sweep torvalds/linux/issues/1234"_ | `sweep` | Sweep a public GitHub thread for bots |
109
+
110
+ **Rate limits:** `agentscore` 30/min and `sweep` 10/min per session. Excess calls return a friendly 429-style message.
111
+
112
+ ---
113
+
114
+ ## Setup
115
+
116
+ For public/business deployments, run in strict mode:
117
+
118
+ ```bash
119
+ export AGENTSCORE_PUBLIC_MODE=true
120
+ export AGENTSCORE_ADAPTER=json # or github / moltbook
121
+ ```
122
+
123
+ AgentScore is a standard MCP server over `stdio`. Any MCP client that can launch local `stdio` servers can use it (not only Cursor/Claude).
124
+
125
+ Public site note: [`ai-agent-score.vercel.app`](https://ai-agent-score.vercel.app) is currently a public trust index/leaderboard experience. MCP `reportUrl` links are handle-based and resolve when that handle exists in the site index.
126
+
127
+ <details>
128
+ <summary><strong>Claude Code</strong> (recommended)</summary>
129
+
130
+ ```bash
131
+ claude mcp add agentscore -- npx -y agentscore-mcp
132
+ ```
133
+ </details>
134
+
135
+ <details>
136
+ <summary><strong>Claude Desktop</strong></summary>
137
+
138
+ Add to `claude_desktop_config.json`:
139
+
140
+ ```json
141
+ {
142
+ "mcpServers": {
143
+ "agentscore": {
144
+ "command": "npx",
145
+ "args": ["-y", "agentscore-mcp"]
146
+ }
147
+ }
148
+ }
149
+ ```
150
+ </details>
151
+
152
+ <details>
153
+ <summary><strong>Cursor</strong></summary>
154
+
155
+ Settings → MCP → Add Server:
156
+
157
+ ```json
158
+ {
159
+ "agentscore": {
160
+ "command": "npx",
161
+ "args": ["-y", "agentscore-mcp"]
162
+ }
163
+ }
164
+ ```
165
+ </details>
166
+
167
+ ---
168
+
169
+ ## Scoring System
170
+
171
+ **Score = 300 + (weighted average / 100) × 550** → Range: 300–850
172
+
173
+ | Tier | Range | Recommendation | What It Means |
174
+ |:---|:---:|:---:|:---|
175
+ | 🟢 Excellent | 750–850 | TRUST | Highly trustworthy, strong track record |
176
+ | 🔵 Good | 650–749 | TRUST | Generally reliable, minor gaps |
177
+ | 🟡 Fair | 550–649 | CAUTION | Mixed signals, verify before relying |
178
+ | 🟠 Poor | 450–549 | CAUTION | Significant concerns, limited trust |
179
+ | 🔴 Critical | 300–449 | AVOID | Red flags detected, recommend avoidance |
180
+
181
+ ### Six Dimensions
182
+
183
+ | Dimension | Weight | What It Measures |
184
+ |:---|:---:|:---|
185
+ | Content Quality | 25% | Depth, diversity, community resonance |
186
+ | Behavioral Consistency | 20% | Posting rhythm, recency, identity signals |
187
+ | Interaction Quality | 20% | Engagement depth, conversational balance |
188
+ | Risk Signals | 20% | Spam, manipulation keywords, prompt injection |
189
+ | Account Health | 10% | Age, karma, profile completeness |
190
+ | Community Standing | 5% | Social proof, verification, network effects |
191
+
192
+ ### Confidence Levels
193
+
194
+ | Level | Meaning |
195
+ |:---|:---|
196
+ | **High** | Scored within the last 6 hours |
197
+ | **Medium** | 6–24 hours old (cached) |
198
+ | **Low** | Older than 24 hours |
199
+
200
+ ---
201
+
202
+ ## Built-in Demo Agents
203
+
204
+ Every install ships with 10 fictional agents. No setup required — they exist so you can try every feature immediately.
205
+
206
+ | Agent | Score | Tier | What It Demonstrates |
207
+ |:---|:---:|:---:|:---|
208
+ | `@NovaMind` | ~756 | 🟢 Excellent | Research AI — consistent, transparent, self-correcting |
209
+ | `@TrustPilot` | ~743 | 🔵 Good | Community moderator — fair rulings, public reasoning |
210
+ | `@HelperBot` | ~748 | 🔵 Good | Coding assistant — solid output, slightly formulaic |
211
+ | `@DataPulse` | ~720 | 🔵 Good | Analytics agent — strong data, lower interaction |
212
+ | `@BuzzAgent` | ~657 | 🔵 Good | Hot take machine — high volume, low depth |
213
+ | `@GhostAgent` | ~691 | 🔵 Good | Was decent, now dormant 60+ days (recency penalty) |
214
+ | `@SockPuppet1` | ~573 | 🟡 Fair | Coordinated shill — part of a pair ↕ |
215
+ | `@SockPuppet2` | ~569 | 🟡 Fair | Coordinated shill — part of a pair ↕ |
216
+ | `@SpamBot3000` | ~474 | 🟠 Poor | Spam — manipulation keywords, templated posts |
217
+ | `@EchoSpark` | ~520 | 🟠 Poor | Prompt injection patterns in every post |
218
+
219
+ **Try the sweep:** `"Sweep demo-thread-001"` — catches SockPuppet1 and SockPuppet2 coordinating in a discussion thread. Content similarity, timing anomalies, amplification patterns — all detected.
220
+
221
+ ---
222
+
223
+ ## Platform Adapters
224
+
225
+ AgentScore ships with four adapters. Build your own in ~50 lines.
226
+
227
+ ### Demo (default — zero config)
228
+
229
+ Works out of the box. 10 built-in agents, 1 demo thread.
230
+
231
+ ### GitHub
232
+
233
+ Score any public GitHub account. Analyzes profile metadata, repos, issues/PRs, comments, and reactions.
234
+
235
+ ```bash
236
+ export AGENTSCORE_ADAPTER=github
237
+ # Optional: export GITHUB_TOKEN=ghp_... (60→5,000 req/hr)
238
+ ```
239
+
240
+ **Thread format for sweep:** `owner/repo/issues/123` or `owner/repo/pulls/123`
241
+
242
+ <details>
243
+ <summary>What gets analyzed</summary>
244
+
245
+ - **Profile** — account age, bio, company, followers, public repos
246
+ - **Content** — issues and PRs authored (via search API), quality and depth
247
+ - **Interactions** — comments, reviews, reactions from public events
248
+ - **Threads** — full issue/PR conversations with all participants
249
+ </details>
250
+
251
+ ### JSON (bring your own data)
252
+
253
+ Pipe in any data source without writing code.
254
+
255
+ ```bash
256
+ export AGENTSCORE_ADAPTER=json
257
+ export AGENTSCORE_DATA_PATH=./data/agents.json
258
+ ```
259
+
260
+ <details>
261
+ <summary>JSON format</summary>
262
+
263
+ ```json
264
+ {
265
+ "agents": [{ "profile": { "handle": "my-bot", "platform": "custom", "createdAt": "2024-01-15T00:00:00Z", "claimed": true }, "content": [{ "id": "1", "type": "post", "content": "Hello", "upvotes": 5, "downvotes": 0, "replyCount": 3, "createdAt": "2024-11-01T10:00:00Z" }] }],
266
+ "threads": [{ "id": "support-thread-42", "participantHandles": ["my-bot"], "content": [{ "id": "t1", "type": "post", "content": "Can your bot export records?", "upvotes": 0, "downvotes": 0, "replyCount": 1, "createdAt": "2024-11-02T08:00:00Z" }] }]
267
+ }
268
+ ```
269
+
270
+ Full sample file: [`examples/agents.sample.json`](examples/agents.sample.json)
271
+ </details>
272
+
273
+ `threads` is optional, but required if you want `sweep` to work with the JSON adapter.
274
+
275
+ ### Moltbook
276
+
277
+ Score live agents on [moltbook.com](https://moltbook.com).
278
+
279
+ ```bash
280
+ export AGENTSCORE_ADAPTER=moltbook
281
+ export MOLTBOOK_API_KEY=moltbook_sk_your_key_here
282
+ ```
283
+
284
+ Note: `sweep` requires thread participants. Moltbook currently provides thread content but does not return participant profiles, so sweep results may be unavailable on Moltbook.
285
+
286
+ Adapter limitations are documented in `TRUST.md`.
287
+
288
+ ### Build Your Own
289
+
290
+ Implement 3 methods. The scoring engine handles everything else.
291
+
292
+ ```typescript
293
+ import type { AgentPlatformAdapter } from 'agentscore-mcp';
294
+
295
+ class MyAdapter implements AgentPlatformAdapter {
296
+ name = 'my-platform';
297
+ version = '1.0.0';
298
+ async fetchProfile(handle: string) { /* → AgentProfile | null */ }
299
+ async fetchContent(handle: string) { /* → AgentContent[] */ }
300
+ async isAvailable() { return true; }
301
+ }
302
+ ```
303
+
304
+ Full example: [`examples/custom-adapter.ts`](examples/custom-adapter.ts) · Guide: [`CONTRIBUTING.md`](CONTRIBUTING.md)
305
+
306
+ ---
307
+
308
+ ## Use Cases
309
+
310
+ **Enterprise AI Governance** — Your CISO asks, _"How do we audit 15 production agents before quarterly review?"_ You point AgentScore at conversation logs, run a fleet check, and hand over briefings with category-level risk evidence.
311
+
312
+ **Vendor Selection** — You're choosing between 3 vendor bots. Instead of demo theater, you score real transcripts side-by-side and compare risk, behavior, and interaction quality before procurement signs.
313
+
314
+ **Astroturfing Detection** — Suspicious accounts posting coordinated reviews? `sweep` detects content similarity, timing anomalies, and amplification networks.
315
+
316
+ **Rate My Bot** — You ask _"investigate my bot, be brutally honest."_ AgentScore roasts weaknesses with receipts so you can ship the next prompt/update with confidence.
317
+
318
+ **Agent Draft** — Building an AI agent team? Compare 5 candidates and let AgentScore pick category winners like fantasy football, except the bad draft picks can leak data.
319
+
320
+ ---
321
+
322
+ ## Architecture
323
+
324
+ ```mermaid
325
+ flowchart TD
326
+ A["AI Assistant (Claude, Cursor, etc.)"] -->|"MCP (stdio)"| B["AgentScore MCP Server<br/>tools: agentscore + sweep"]
327
+ B --> C["Adapter Layer<br/>Demo | GitHub | JSON | Moltbook | custom"]
328
+ C --> D["Scoring Engine<br/>6 weighted dimensions -> 300-850"]
329
+ D --> E["Outputs<br/>Narrative briefing + structured JSON + badge URL"]
330
+ ```
331
+
332
+ **2 runtime dependencies:** `@modelcontextprotocol/sdk` + `zod`. That's it.
333
+
334
+ ---
335
+
336
+ ## Environment Variables
337
+
338
+ | Variable | Default | Description |
339
+ |:---|:---:|:---|
340
+ | `AGENTSCORE_ADAPTER` | `demo` | `demo` · `github` · `json` · `moltbook` |
341
+ | `AGENTSCORE_PUBLIC_MODE` | `false` | If `true`, requires explicit adapter and blocks `demo` |
342
+ | `GITHUB_TOKEN` | — | GitHub PAT (optional, increases rate limit to 5,000/hr) |
343
+ | `MOLTBOOK_API_KEY` | — | Required for Moltbook adapter |
344
+ | `AGENTSCORE_DATA_PATH` | — | Required for JSON adapter |
345
+ | `AGENTSCORE_CACHE_TTL` | `86400` | Score cache TTL in seconds |
346
+ | `AGENTSCORE_RATE_LIMIT_MS` | `200` | Moltbook adapter request delay (ms) |
347
+ | `AGENTSCORE_SITE_URL` | `https://ai-agent-score.vercel.app` | Base URL for report links in MCP output |
348
+
349
+ Invalid numeric values fall back to defaults. Trailing slashes on URLs are trimmed automatically. `AGENTSCORE_SITE_URL` must be a valid `https://` URL.
350
+
351
+ ---
352
+
353
+ ## Development
354
+
355
+ ```bash
356
+ git clone https://github.com/tmishra-sp/agentscore-mcp.git
357
+ cd agentscore-mcp
358
+ npm install
359
+ cp .env.example .env
360
+
361
+ npm run dev # Start with tsx (hot reload)
362
+ npm run build # Compile TypeScript
363
+ npm run typecheck # Strict mode, zero errors
364
+ npm run test # Run all test suites
365
+ npm run benchmark # Reproducible benchmark report (benchmarks/results/latest.json)
366
+ npm run benchmark:strict # Fail if benchmark thresholds regress
367
+ npm run inspect # Interactive testing with MCP Inspector
368
+ ```
369
+
370
+ See [`CONTRIBUTING.md`](CONTRIBUTING.md) for PR guidelines and adapter development.
371
+ Release process: [`RELEASING.md`](RELEASING.md)
372
+
373
+ Benchmark details and dataset format: [`benchmarks/README.md`](benchmarks/README.md)
374
+ Launch distribution assets: [`marketing/launch-kit.md`](marketing/launch-kit.md)
375
+
376
+ ---
377
+
378
+ ## Trust & Transparency
379
+
380
+ We're building a trust tool. It would be hypocritical to ask you to trust a black box.
381
+
382
+ **Default mode (demo): zero network requests.** All data is built-in.
383
+
384
+ Set `AGENTSCORE_PUBLIC_MODE=true` to force real adapters only (`json`, `github`, or `moltbook`) in production environments.
385
+
386
+ When adapters are enabled, the server makes read-only GET requests to exactly one destination — the configured platform API. No telemetry, no analytics, no data sent to AgentScore servers. Every line is open source. Read it.
387
+
388
+ ```bash
389
+ grep -r "fetch(" src/ # Every network call
390
+ grep -r "readFile\|writeFile" src/ # Every file operation
391
+ grep -r "process.env" src/ # Every env var accessed
392
+ ```
393
+
394
+ Full details: [`TRUST.md`](TRUST.md) · Security policy: [`SECURITY.md`](SECURITY.md)
395
+
396
+ ---
397
+
398
+ ## License
399
+
400
+ MIT · Tripti Mishra
401
+
402
+ [GitHub Issues](https://github.com/tmishra-sp/agentscore-mcp/issues) · [LinkedIn](https://www.linkedin.com/in/triptimishra1/) · [X](https://x.com/tripti_mishra1)
403
+
404
+ <p align="center"><em>Trust is a signal. We decode it.</em></p>
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Demo Adapter — the default, zero-config experience.
3
+ *
4
+ * Ships with 10 built-in fictional agents spanning every trust tier.
5
+ * No API keys, no env vars, no data files. Install and ask.
6
+ *
7
+ * Also implements thread operations for the sweep tool demo.
8
+ */
9
+ import type { AgentPlatformAdapter, AgentProfile, AgentContent } from "../types.js";
10
+ export declare class DemoAdapter implements AgentPlatformAdapter {
11
+ readonly name = "demo";
12
+ readonly version = "1.0.3";
13
+ fetchProfile(handle: string): Promise<AgentProfile | null>;
14
+ fetchContent(handle: string, limit?: number): Promise<AgentContent[]>;
15
+ fetchInteractions(handle: string, limit?: number): Promise<AgentContent[]>;
16
+ fetchThreadParticipants(threadId: string): Promise<AgentProfile[]>;
17
+ fetchThreadContent(threadId: string): Promise<AgentContent[]>;
18
+ isAvailable(): Promise<boolean>;
19
+ /** Case-insensitive agent lookup. */
20
+ private findAgent;
21
+ }
22
+ //# sourceMappingURL=adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/demo/adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AASpF,qBAAa,WAAY,YAAW,oBAAoB;IACtD,QAAQ,CAAC,IAAI,UAAU;IACvB,QAAQ,CAAC,OAAO,WAAsB;IAEhC,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAK1D,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAOrE,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAO1E,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAalE,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAK7D,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAIrC,qCAAqC;IACrC,OAAO,CAAC,SAAS;CAWlB"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Demo Adapter — the default, zero-config experience.
3
+ *
4
+ * Ships with 10 built-in fictional agents spanning every trust tier.
5
+ * No API keys, no env vars, no data files. Install and ask.
6
+ *
7
+ * Also implements thread operations for the sweep tool demo.
8
+ */
9
+ import { DEMO_AGENTS, DEMO_THREAD_ID, DEMO_THREAD_CONTENT, DEMO_THREAD_AUTHORS, } from "./agents.js";
10
+ import { AGENTSCORE_VERSION } from "../../version.js";
11
+ export class DemoAdapter {
12
+ name = "demo";
13
+ version = AGENTSCORE_VERSION;
14
+ async fetchProfile(handle) {
15
+ const agent = this.findAgent(handle);
16
+ return agent?.profile ?? null;
17
+ }
18
+ async fetchContent(handle, limit) {
19
+ const agent = this.findAgent(handle);
20
+ if (!agent)
21
+ return [];
22
+ const content = agent.content;
23
+ return limit ? content.slice(0, limit) : content;
24
+ }
25
+ async fetchInteractions(handle, limit) {
26
+ const agent = this.findAgent(handle);
27
+ if (!agent)
28
+ return [];
29
+ const interactions = agent.interactions;
30
+ return limit ? interactions.slice(0, limit) : interactions;
31
+ }
32
+ async fetchThreadParticipants(threadId) {
33
+ if (threadId !== DEMO_THREAD_ID)
34
+ return [];
35
+ // Get unique participant handles from the thread
36
+ const handles = new Set(Object.values(DEMO_THREAD_AUTHORS));
37
+ const profiles = [];
38
+ for (const handle of handles) {
39
+ const agent = this.findAgent(handle);
40
+ if (agent)
41
+ profiles.push(agent.profile);
42
+ }
43
+ return profiles;
44
+ }
45
+ async fetchThreadContent(threadId) {
46
+ if (threadId !== DEMO_THREAD_ID)
47
+ return [];
48
+ return DEMO_THREAD_CONTENT;
49
+ }
50
+ async isAvailable() {
51
+ return true;
52
+ }
53
+ /** Case-insensitive agent lookup. */
54
+ findAgent(handle) {
55
+ // Try exact match first
56
+ if (DEMO_AGENTS[handle])
57
+ return DEMO_AGENTS[handle];
58
+ // Case-insensitive fallback
59
+ const lower = handle.toLowerCase();
60
+ for (const [key, agent] of Object.entries(DEMO_AGENTS)) {
61
+ if (key.toLowerCase() === lower)
62
+ return agent;
63
+ }
64
+ return null;
65
+ }
66
+ }
67
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../src/adapters/demo/adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EACL,WAAW,EACX,cAAc,EACd,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEtD,MAAM,OAAO,WAAW;IACb,IAAI,GAAG,MAAM,CAAC;IACd,OAAO,GAAG,kBAAkB,CAAC;IAEtC,KAAK,CAAC,YAAY,CAAC,MAAc;QAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACrC,OAAO,KAAK,EAAE,OAAO,IAAI,IAAI,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,MAAc,EAAE,KAAc;QAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACrC,IAAI,CAAC,KAAK;YAAE,OAAO,EAAE,CAAC;QACtB,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;QAC9B,OAAO,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,MAAc,EAAE,KAAc;QACpD,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACrC,IAAI,CAAC,KAAK;YAAE,OAAO,EAAE,CAAC;QACtB,MAAM,YAAY,GAAG,KAAK,CAAC,YAAY,CAAC;QACxC,OAAO,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;IAC7D,CAAC;IAED,KAAK,CAAC,uBAAuB,CAAC,QAAgB;QAC5C,IAAI,QAAQ,KAAK,cAAc;YAAE,OAAO,EAAE,CAAC;QAE3C,iDAAiD;QACjD,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,CAAC;QAC5D,MAAM,QAAQ,GAAmB,EAAE,CAAC;QACpC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YACrC,IAAI,KAAK;gBAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC1C,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,QAAgB;QACvC,IAAI,QAAQ,KAAK,cAAc;YAAE,OAAO,EAAE,CAAC;QAC3C,OAAO,mBAAmB,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,WAAW;QACf,OAAO,IAAI,CAAC;IACd,CAAC;IAED,qCAAqC;IAC7B,SAAS,CAAC,MAAc;QAC9B,wBAAwB;QACxB,IAAI,WAAW,CAAC,MAAM,CAAC;YAAE,OAAO,WAAW,CAAC,MAAM,CAAC,CAAC;QAEpD,4BAA4B;QAC5B,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;QACnC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;YACvD,IAAI,GAAG,CAAC,WAAW,EAAE,KAAK,KAAK;gBAAE,OAAO,KAAK,CAAC;QAChD,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * 10 curated fictional agents for the built-in demo experience.
3
+ * Each agent showcases a different scoring scenario — from Excellent to Critical,
4
+ * including a coordinated sock puppet pair for sweep demos.
5
+ *
6
+ * This data IS the first impression. Every profile and post is designed to
7
+ * produce realistic, varied scores when run through the scoring engine.
8
+ */
9
+ import type { AgentProfile, AgentContent } from "../types.js";
10
+ export interface DemoAgent {
11
+ profile: AgentProfile;
12
+ content: AgentContent[];
13
+ interactions: AgentContent[];
14
+ }
15
+ export declare const DEMO_THREAD_ID = "demo-thread-001";
16
+ export declare const DEMO_THREAD_CONTENT: AgentContent[];
17
+ export declare const DEMO_THREAD_AUTHORS: Record<string, string>;
18
+ export declare const DEMO_AGENTS: Record<string, DemoAgent>;
19
+ //# sourceMappingURL=agents.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../../src/adapters/demo/agents.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE9D,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,YAAY,CAAC;IACtB,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,YAAY,EAAE,YAAY,EAAE,CAAC;CAC9B;AA+cD,eAAO,MAAM,cAAc,oBAAoB,CAAC;AAEhD,eAAO,MAAM,mBAAmB,EAAE,YAAY,EAS7C,CAAC;AAGF,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAStD,CAAC;AAMF,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAWjD,CAAC"}