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.
- package/LICENSE +21 -0
- package/README.md +404 -0
- package/dist/adapters/demo/adapter.d.ts +22 -0
- package/dist/adapters/demo/adapter.d.ts.map +1 -0
- package/dist/adapters/demo/adapter.js +67 -0
- package/dist/adapters/demo/adapter.js.map +1 -0
- package/dist/adapters/demo/agents.d.ts +19 -0
- package/dist/adapters/demo/agents.d.ts.map +1 -0
- package/dist/adapters/demo/agents.js +480 -0
- package/dist/adapters/demo/agents.js.map +1 -0
- package/dist/adapters/github/adapter.d.ts +15 -0
- package/dist/adapters/github/adapter.d.ts.map +1 -0
- package/dist/adapters/github/adapter.js +75 -0
- package/dist/adapters/github/adapter.js.map +1 -0
- package/dist/adapters/github/client.d.ts +22 -0
- package/dist/adapters/github/client.d.ts.map +1 -0
- package/dist/adapters/github/client.js +220 -0
- package/dist/adapters/github/client.js.map +1 -0
- package/dist/adapters/github/mapper.d.ts +18 -0
- package/dist/adapters/github/mapper.d.ts.map +1 -0
- package/dist/adapters/github/mapper.js +132 -0
- package/dist/adapters/github/mapper.js.map +1 -0
- package/dist/adapters/github/types.d.ts +117 -0
- package/dist/adapters/github/types.d.ts.map +1 -0
- package/dist/adapters/github/types.js +3 -0
- package/dist/adapters/github/types.js.map +1 -0
- package/dist/adapters/json/adapter.d.ts +36 -0
- package/dist/adapters/json/adapter.d.ts.map +1 -0
- package/dist/adapters/json/adapter.js +149 -0
- package/dist/adapters/json/adapter.js.map +1 -0
- package/dist/adapters/moltbook/adapter.d.ts +18 -0
- package/dist/adapters/moltbook/adapter.d.ts.map +1 -0
- package/dist/adapters/moltbook/adapter.js +119 -0
- package/dist/adapters/moltbook/adapter.js.map +1 -0
- package/dist/adapters/moltbook/client.d.ts +14 -0
- package/dist/adapters/moltbook/client.d.ts.map +1 -0
- package/dist/adapters/moltbook/client.js +165 -0
- package/dist/adapters/moltbook/client.js.map +1 -0
- package/dist/adapters/moltbook/types.d.ts +57 -0
- package/dist/adapters/moltbook/types.d.ts.map +1 -0
- package/dist/adapters/moltbook/types.js +3 -0
- package/dist/adapters/moltbook/types.js.map +1 -0
- package/dist/adapters/types.d.ts +45 -0
- package/dist/adapters/types.d.ts.map +1 -0
- package/dist/adapters/types.js +2 -0
- package/dist/adapters/types.js.map +1 -0
- package/dist/cache/score-cache.d.ts +22 -0
- package/dist/cache/score-cache.d.ts.map +1 -0
- package/dist/cache/score-cache.js +48 -0
- package/dist/cache/score-cache.js.map +1 -0
- package/dist/config.d.ts +15 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +72 -0
- package/dist/config.js.map +1 -0
- package/dist/scoring/briefing.d.ts +5 -0
- package/dist/scoring/briefing.d.ts.map +1 -0
- package/dist/scoring/briefing.js +124 -0
- package/dist/scoring/briefing.js.map +1 -0
- package/dist/scoring/categories/account-health.d.ts +4 -0
- package/dist/scoring/categories/account-health.d.ts.map +1 -0
- package/dist/scoring/categories/account-health.js +67 -0
- package/dist/scoring/categories/account-health.js.map +1 -0
- package/dist/scoring/categories/behavioral-consistency.d.ts +4 -0
- package/dist/scoring/categories/behavioral-consistency.d.ts.map +1 -0
- package/dist/scoring/categories/behavioral-consistency.js +66 -0
- package/dist/scoring/categories/behavioral-consistency.js.map +1 -0
- package/dist/scoring/categories/community-standing.d.ts +4 -0
- package/dist/scoring/categories/community-standing.d.ts.map +1 -0
- package/dist/scoring/categories/community-standing.js +45 -0
- package/dist/scoring/categories/community-standing.js.map +1 -0
- package/dist/scoring/categories/content-quality.d.ts +4 -0
- package/dist/scoring/categories/content-quality.d.ts.map +1 -0
- package/dist/scoring/categories/content-quality.js +42 -0
- package/dist/scoring/categories/content-quality.js.map +1 -0
- package/dist/scoring/categories/interaction-quality.d.ts +4 -0
- package/dist/scoring/categories/interaction-quality.d.ts.map +1 -0
- package/dist/scoring/categories/interaction-quality.js +49 -0
- package/dist/scoring/categories/interaction-quality.js.map +1 -0
- package/dist/scoring/categories/risk-signals.d.ts +8 -0
- package/dist/scoring/categories/risk-signals.d.ts.map +1 -0
- package/dist/scoring/categories/risk-signals.js +69 -0
- package/dist/scoring/categories/risk-signals.js.map +1 -0
- package/dist/scoring/engine.d.ts +7 -0
- package/dist/scoring/engine.d.ts.map +1 -0
- package/dist/scoring/engine.js +165 -0
- package/dist/scoring/engine.js.map +1 -0
- package/dist/scoring/tiers.d.ts +11 -0
- package/dist/scoring/tiers.d.ts.map +1 -0
- package/dist/scoring/tiers.js +17 -0
- package/dist/scoring/tiers.js.map +1 -0
- package/dist/scoring/types.d.ts +39 -0
- package/dist/scoring/types.d.ts.map +1 -0
- package/dist/scoring/types.js +2 -0
- package/dist/scoring/types.js.map +1 -0
- package/dist/scoring/utils.d.ts +9 -0
- package/dist/scoring/utils.d.ts.map +1 -0
- package/dist/scoring/utils.js +48 -0
- package/dist/scoring/utils.js.map +1 -0
- package/dist/security/client-key.d.ts +6 -0
- package/dist/security/client-key.d.ts.map +1 -0
- package/dist/security/client-key.js +42 -0
- package/dist/security/client-key.js.map +1 -0
- package/dist/security/rate-limiter.d.ts +24 -0
- package/dist/security/rate-limiter.d.ts.map +1 -0
- package/dist/security/rate-limiter.js +47 -0
- package/dist/security/rate-limiter.js.map +1 -0
- package/dist/server.d.ts +3 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +83 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/agentscore.d.ts +5 -0
- package/dist/tools/agentscore.d.ts.map +1 -0
- package/dist/tools/agentscore.js +149 -0
- package/dist/tools/agentscore.js.map +1 -0
- package/dist/tools/sweep.d.ts +5 -0
- package/dist/tools/sweep.d.ts.map +1 -0
- package/dist/tools/sweep.js +280 -0
- package/dist/tools/sweep.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +2 -0
- package/dist/version.js.map +1 -0
- 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"}
|