curo-peptides 0.0.0-stage → 1.0.1

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 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
- # Temporary Holding Version
1
+ # Curo Peptide Research MCP: PepBank Studies, Peptide Lookup and Lab Reports (COAs)
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ [![MCP Badge](https://lobehub.com/badge/mcp/curo-you-peptides-peptide-research-mcp)](https://lobehub.com/mcp/curo-you-peptides-peptide-research-mcp)
4
+ [![Curo Peptide Research MCP connector](https://glama.ai/mcp/connectors/you.curo/peptide-research/badges/score.svg)](https://glama.ai/mcp/connectors/you.curo/peptide-research)
5
+ [![skills.sh](https://skills.sh/b/curo-you-peptides/peptide-research-mcp)](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.1";
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": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "1.0.1",
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
+ }