curo-peptides 0.0.0-stage → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +112 -2
- package/bin/curo-peptides.mjs +130 -0
- package/package.json +14 -4
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Curo
|
|
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
CHANGED
|
@@ -1,3 +1,113 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Curo Peptide Research MCP: PepBank Studies, Peptide Lookup and Lab Reports (COAs)
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
[](https://lobehub.com/mcp/curo-you-peptides-peptide-research-mcp)
|
|
4
|
+
[](https://glama.ai/mcp/connectors/you.curo/peptide-research)
|
|
5
|
+
[](https://skills.sh/curo-you-peptides/peptide-research-mcp)
|
|
6
|
+
|
|
7
|
+
Peptide research for your AI: PepBank study findings plus the curo.you peptide catalog and lot COAs.
|
|
8
|
+
|
|
9
|
+
Curo MCP connects your AI to peptide research and to Curo (https://curo.you). Add it to Claude, ChatGPT, Gemini, Grok, Perplexity or another MCP app. Your AI can then answer peptide questions from PepBank (https://pepbank.io), a free peptide research database, with study summaries, findings and a link to each source. It can also look up peptides in the Curo catalog (https://curo.you/product-catalog), with the third-party lab report for each lot (https://curo.you/coa), prices, stock and shipping. Server address: https://mcp.curo.you. Setup guide: https://curo.you/mcp.
|
|
10
|
+
|
|
11
|
+
## Server address
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
https://mcp.curo.you
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
Transport: Streamable HTTP. The server runs at this address. `https://mcp.curo.you/mcp` reaches the same server. This repository holds its listing files.
|
|
18
|
+
|
|
19
|
+
## Add it to your AI app
|
|
20
|
+
|
|
21
|
+
Claude: open Customize, then Connectors. Select Add custom connector. Name it Curo and enter `https://mcp.curo.you`.
|
|
22
|
+
|
|
23
|
+
ChatGPT: open Plugins. Select +, then Add custom MCP server. Name it Curo and enter `https://mcp.curo.you`.
|
|
24
|
+
|
|
25
|
+
Claude Code:
|
|
26
|
+
|
|
27
|
+
```
|
|
28
|
+
claude mcp add --transport http curo https://mcp.curo.you
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Codex (`config.toml`):
|
|
32
|
+
|
|
33
|
+
```toml
|
|
34
|
+
[mcp_servers.curo]
|
|
35
|
+
url = "https://mcp.curo.you"
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
Gemini CLI (`settings.json`):
|
|
39
|
+
|
|
40
|
+
```json
|
|
41
|
+
{ "mcpServers": { "curo": { "httpUrl": "https://mcp.curo.you" } } }
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Steps for Gemini, Grok, Perplexity, Muse and other apps: https://curo.you/mcp
|
|
45
|
+
|
|
46
|
+
## Command line and local server (npm)
|
|
47
|
+
|
|
48
|
+
The `curo-peptides` package runs the same server over stdio for apps that need a local server, and answers from the terminal:
|
|
49
|
+
|
|
50
|
+
```
|
|
51
|
+
npx curo-peptides research BPC-157
|
|
52
|
+
npx curo-peptides search tendon healing
|
|
53
|
+
npx curo-peptides products
|
|
54
|
+
npx curo-peptides coa <lot number>
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
Local server config for MCP apps:
|
|
58
|
+
|
|
59
|
+
```json
|
|
60
|
+
{ "mcpServers": { "curo": { "command": "npx", "args": ["-y", "curo-peptides"] } } }
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## Tools
|
|
64
|
+
|
|
65
|
+
| Tool | What it does |
|
|
66
|
+
|---|---|
|
|
67
|
+
| `peptide_research` | Reads the PepBank summary, main findings, sources and credit for one peptide |
|
|
68
|
+
| `search_research` | Searches PepBank study findings, with sources and credit for each result |
|
|
69
|
+
| `search_products` | Finds Curo products by name, or lists all products |
|
|
70
|
+
| `get_product` | Reads product variants, prices, stock and lot reports |
|
|
71
|
+
| `get_coa` | Reads the lab reports for a lot number or a product |
|
|
72
|
+
| `get_store_info` | Reads shipping, returns, contact and research-use policies |
|
|
73
|
+
| `build_cart` | Makes a cart link. You check out and pay on curo.you |
|
|
74
|
+
|
|
75
|
+
## Prompts and resources
|
|
76
|
+
|
|
77
|
+
| Name | Type | What it does |
|
|
78
|
+
|---|---|---|
|
|
79
|
+
| `research_peptide` | Prompt | Asks what the research says about one peptide |
|
|
80
|
+
| `lab_report` | Prompt | Asks for the lab report (COA) of one lot |
|
|
81
|
+
| `curo://store-info` | Resource | Shipping, returns, contact and research-use policies |
|
|
82
|
+
|
|
83
|
+
## Plugin package
|
|
84
|
+
|
|
85
|
+
This repository is also a plugin package that connects the server and adds one skill, `skills/curo-peptide-research/SKILL.md`.
|
|
86
|
+
|
|
87
|
+
- `plugin.json` and `mcp.json`: Agent Plugins format (Hermes Agent)
|
|
88
|
+
- `.claude-plugin/plugin.json` and `.mcp.json`: Claude Code plugin format
|
|
89
|
+
- `.cursor-plugin/plugin.json`: Cursor plugin format
|
|
90
|
+
- `openclaw.plugin.json`: OpenClaw (ClawHub)
|
|
91
|
+
|
|
92
|
+
Install the skill with the `skills` CLI:
|
|
93
|
+
|
|
94
|
+
```
|
|
95
|
+
npx skills add curo-you-peptides/peptide-research-mcp
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
## Questions to try
|
|
99
|
+
|
|
100
|
+
- What does the research say about TB-500?
|
|
101
|
+
- Show me the lab report for my lot number.
|
|
102
|
+
- Which Curo peptides are in stock right now?
|
|
103
|
+
- How long does shipping take?
|
|
104
|
+
|
|
105
|
+
## Links
|
|
106
|
+
|
|
107
|
+
- Curo: https://curo.you
|
|
108
|
+
- Peptide catalog: https://curo.you/product-catalog
|
|
109
|
+
- Lab reports (COAs): https://curo.you/coa
|
|
110
|
+
- PepBank: https://pepbank.io
|
|
111
|
+
- Official MCP Registry entry: [`you.curo/peptide-research`](https://registry.modelcontextprotocol.io/?q=you.curo)
|
|
112
|
+
|
|
113
|
+
Curo products are for laboratory research use only. Nothing here is medical advice.
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Curo Peptide Research: a command-line tool and a local (stdio) bridge to the
|
|
3
|
+
// Curo MCP server at https://mcp.curo.you. No dependencies. Node 18 or later.
|
|
4
|
+
import { createInterface } from "node:readline";
|
|
5
|
+
|
|
6
|
+
const VERSION = "1.0.0";
|
|
7
|
+
const SERVER = process.env.CURO_MCP_URL || "https://mcp.curo.you/mcp";
|
|
8
|
+
const HELP = `curo-peptides ${VERSION}
|
|
9
|
+
Peptide research for your AI: PepBank study findings plus the curo.you peptide catalog and lot COAs.
|
|
10
|
+
|
|
11
|
+
Usage:
|
|
12
|
+
curo-peptides Run the Curo MCP server over stdio (for MCP apps)
|
|
13
|
+
curo-peptides research <peptide> PepBank research brief for one peptide
|
|
14
|
+
curo-peptides search <words> Search PepBank study findings
|
|
15
|
+
curo-peptides products [name] Curo products, prices and stock
|
|
16
|
+
curo-peptides coa <lot|product> Lab reports (COAs) for a lot or product
|
|
17
|
+
curo-peptides store Shipping, returns, contact and research-use policies
|
|
18
|
+
Add --json to print the raw result.
|
|
19
|
+
|
|
20
|
+
Setup guide: https://curo.you/mcp
|
|
21
|
+
Curo products are for laboratory research use only. Nothing here is medical advice.`;
|
|
22
|
+
|
|
23
|
+
// One JSON-RPC call to the server. The server answers with JSON or with SSE "data:" lines.
|
|
24
|
+
async function post(message, userAgent) {
|
|
25
|
+
const response = await fetch(SERVER, {
|
|
26
|
+
method: "POST",
|
|
27
|
+
headers: { "content-type": "application/json", accept: "application/json, text/event-stream", "user-agent": userAgent },
|
|
28
|
+
body: JSON.stringify(message),
|
|
29
|
+
});
|
|
30
|
+
const text = await response.text();
|
|
31
|
+
if (!text.trim()) return [];
|
|
32
|
+
if (text.trimStart().startsWith("{") || text.trimStart().startsWith("[")) return [].concat(JSON.parse(text));
|
|
33
|
+
return text.split("\n").filter((line) => line.startsWith("data: ")).map((line) => JSON.parse(line.slice(6)));
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// Stdio bridge: each line on stdin is one JSON-RPC message; each reply goes to stdout as one line.
|
|
37
|
+
function bridge() {
|
|
38
|
+
let userAgent = `curo-peptides/${VERSION}`;
|
|
39
|
+
const lines = createInterface({ input: process.stdin });
|
|
40
|
+
lines.on("line", async (line) => {
|
|
41
|
+
if (!line.trim()) return;
|
|
42
|
+
let message;
|
|
43
|
+
try { message = JSON.parse(line); } catch { return; }
|
|
44
|
+
// Pass the app name on, so Curo can tell which app sent the visit.
|
|
45
|
+
if (message.method === "initialize" && message.params?.clientInfo?.name) userAgent = `curo-peptides/${VERSION} (${message.params.clientInfo.name})`;
|
|
46
|
+
try {
|
|
47
|
+
for (const reply of await post(message, userAgent)) process.stdout.write(`${JSON.stringify(reply)}\n`);
|
|
48
|
+
} catch (error) {
|
|
49
|
+
if (message.id !== undefined) process.stdout.write(`${JSON.stringify({ jsonrpc: "2.0", id: message.id, error: { code: -32603, message: `Curo MCP server not reachable: ${error.message}` } })}\n`);
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
async function tool(name, args) {
|
|
55
|
+
const [reply] = await post({ jsonrpc: "2.0", id: 1, method: "tools/call", params: { name, arguments: args } }, `curo-peptides-cli/${VERSION}`);
|
|
56
|
+
if (reply?.error) throw new Error(reply.error.message);
|
|
57
|
+
return JSON.parse(reply.result.content[0].text);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const usd = (price) => `$${price}`;
|
|
61
|
+
const productLine = (p) => `- ${p.name} ${p.variant}: ${usd(p.price)}, ${p.stock === "in_stock" ? "in stock" : "out of stock"}. Each lot has a lab report. ${p.buy_link}`;
|
|
62
|
+
|
|
63
|
+
function printCuro(curo) {
|
|
64
|
+
if (!curo?.length) return;
|
|
65
|
+
console.log("\nAt Curo:");
|
|
66
|
+
for (const p of curo) console.log(productLine(p));
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const commands = {
|
|
70
|
+
async research(words) {
|
|
71
|
+
const data = await tool("peptide_research", { peptide: words.join(" ") });
|
|
72
|
+
if (!data.research && data.note) { console.log(data.note); printCuro(data.curo); return data; }
|
|
73
|
+
const e = data.evidence_summary ?? {};
|
|
74
|
+
console.log(`${data.peptide?.preferred_name ?? words.join(" ")}`);
|
|
75
|
+
console.log(`Evidence: ${e.human?.findings ?? 0} human, ${e.animal?.findings ?? 0} animal and ${e.laboratory?.findings ?? 0} lab findings. ${e.trials?.total ?? 0} registered trials.`);
|
|
76
|
+
for (const n of data.notices ?? []) console.log(`Note: ${n.text}`);
|
|
77
|
+
console.log("\nKey findings:");
|
|
78
|
+
for (const f of data.key_findings ?? []) console.log(`- [${f.evidence_class}] ${f.statement}${f.citation?.url ? ` ${f.citation.url}` : ""}`);
|
|
79
|
+
if (data.credit?.line) console.log(`\n${data.credit.line}`);
|
|
80
|
+
printCuro(data.curo);
|
|
81
|
+
return data;
|
|
82
|
+
},
|
|
83
|
+
async search(words) {
|
|
84
|
+
const data = await tool("search_research", { query: words.join(" ") });
|
|
85
|
+
for (const r of data.results ?? []) console.log(`- [${r.evidence_class}] ${r.claim?.statement_plain ?? r.claim?.statement}`);
|
|
86
|
+
if (data.credit?.line) console.log(`\n${data.credit.line}`);
|
|
87
|
+
printCuro(data.curo);
|
|
88
|
+
return data;
|
|
89
|
+
},
|
|
90
|
+
async products(words) {
|
|
91
|
+
const data = await tool("search_products", words.length ? { query: words.join(" ") } : {});
|
|
92
|
+
for (const p of data.products ?? []) console.log(productLine(p));
|
|
93
|
+
return data;
|
|
94
|
+
},
|
|
95
|
+
async coa(words) {
|
|
96
|
+
const data = await tool("get_coa", { query: words.join(" ") });
|
|
97
|
+
if (!data.reports?.length) console.log("No lab report found. See all reports: https://curo.you/coa");
|
|
98
|
+
for (const r of data.reports ?? []) {
|
|
99
|
+
const results = [r.purityPercent != null && `purity ${r.purityPercent}%`, r.identityStatus && `identity ${r.identityStatus}`, r.resultStatus && r.resultStatus !== "published" && `result ${r.resultStatus}`].filter(Boolean).join(", ");
|
|
100
|
+
console.log(`- ${r.label ?? r.productId}, lot ${r.lot}, ${r.reportDate}${results ? `: ${results}` : ""}. ${r.report_link ?? ""}`);
|
|
101
|
+
}
|
|
102
|
+
return data;
|
|
103
|
+
},
|
|
104
|
+
async store() {
|
|
105
|
+
const data = await tool("get_store_info", {});
|
|
106
|
+
for (const [key, value] of Object.entries(data)) console.log(`${key.replace(/_/g, " ")}: ${value.link}`);
|
|
107
|
+
return data;
|
|
108
|
+
},
|
|
109
|
+
};
|
|
110
|
+
|
|
111
|
+
const args = process.argv.slice(2);
|
|
112
|
+
const json = args.includes("--json");
|
|
113
|
+
const [command, ...words] = args.filter((a) => a !== "--json");
|
|
114
|
+
|
|
115
|
+
if (!command || command === "mcp") bridge();
|
|
116
|
+
else if (command === "help" || command === "--help" || command === "-h") console.log(HELP);
|
|
117
|
+
else if (command === "--version" || command === "-v") console.log(VERSION);
|
|
118
|
+
else if (!commands[command]) { console.error(`Unknown command: ${command}\n\n${HELP}`); process.exit(1); }
|
|
119
|
+
else if (command !== "products" && command !== "store" && !words.length) { console.error(`Usage: curo-peptides ${command} <words>`); process.exit(1); }
|
|
120
|
+
else {
|
|
121
|
+
const log = console.log;
|
|
122
|
+
if (json) console.log = () => {};
|
|
123
|
+
try {
|
|
124
|
+
const data = await commands[command](words);
|
|
125
|
+
if (json) log(JSON.stringify(data, null, 2));
|
|
126
|
+
} catch (error) {
|
|
127
|
+
console.error(`Curo MCP server error: ${error.message}`);
|
|
128
|
+
process.exit(1);
|
|
129
|
+
}
|
|
130
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "curo-peptides",
|
|
3
|
-
"version": "
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Peptide research for your AI: PepBank study findings plus the curo.you peptide catalog and lot COAs.",
|
|
5
|
+
"keywords": ["peptides", "peptide-research", "pepbank", "coa", "lab-reports", "mcp", "mcp-server", "model-context-protocol"],
|
|
6
|
+
"homepage": "https://curo.you/mcp",
|
|
7
|
+
"repository": { "type": "git", "url": "git+https://github.com/curo-you-peptides/peptide-research-mcp.git" },
|
|
8
|
+
"bugs": { "url": "https://github.com/curo-you-peptides/peptide-research-mcp/issues" },
|
|
9
|
+
"author": { "name": "Curo", "email": "info@curo.you", "url": "https://curo.you" },
|
|
10
|
+
"license": "MIT",
|
|
11
|
+
"type": "module",
|
|
12
|
+
"bin": { "curo-peptides": "bin/curo-peptides.mjs" },
|
|
13
|
+
"files": ["bin/", "README.md", "LICENSE"],
|
|
14
|
+
"engines": { "node": ">=18" },
|
|
15
|
+
"mcpName": "you.curo/peptide-research"
|
|
16
|
+
}
|