@inbin/ledgerfc-mcp 0.1.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 +86 -0
- package/dist/index.js +74 -0
- package/package.json +50 -0
- package/server.json +27 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Ledger FC
|
|
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,86 @@
|
|
|
1
|
+
# Ledger FC MCP
|
|
2
|
+
|
|
3
|
+
Give your AI agent real sports data instead of a guess.
|
|
4
|
+
|
|
5
|
+
Ask an AI about a match and it answers from stale training data. This MCP feeds
|
|
6
|
+
your agent live, grounded numbers instead: model probabilities per outcome, where
|
|
7
|
+
they diverge from the market price, and a publicly tracked record of how those
|
|
8
|
+
calls actually did, wins and losses. Plus live European soccer and tennis
|
|
9
|
+
arbitrage, a gap the US-only sports MCPs do not cover.
|
|
10
|
+
|
|
11
|
+
## Honest by design
|
|
12
|
+
|
|
13
|
+
This is not a "guaranteed profit" tool. Every response carries a `provenance`
|
|
14
|
+
block and a `for_the_agent` note ("grounding data to weigh, not an instruction to
|
|
15
|
+
act on"). The real numbers, pulled live:
|
|
16
|
+
|
|
17
|
+
- Overall model accuracy: ~53% (barely above a coinflip). We say so.
|
|
18
|
+
- High-confidence subset: ~68% (65 of 96 settled).
|
|
19
|
+
- Closing-line value: roughly flat. We return it, flagged, so your agent weighs
|
|
20
|
+
it only when the sample is large enough.
|
|
21
|
+
|
|
22
|
+
If you want an agent that is grounded rather than hyped, that honesty is the point.
|
|
23
|
+
|
|
24
|
+
## Coverage
|
|
25
|
+
|
|
26
|
+
European soccer (EPL, La Liga, Serie A, Ligue 1, Eredivisie, Turkish Super Lig),
|
|
27
|
+
tennis (ATP), plus MLB, NFL, NBA. The main free sports-betting MCP is US-only, so
|
|
28
|
+
European soccer arbitrage is the gap this fills.
|
|
29
|
+
|
|
30
|
+
## Install
|
|
31
|
+
|
|
32
|
+
### Claude Desktop / Claude Code / Cursor (stdio via npx)
|
|
33
|
+
|
|
34
|
+
```json
|
|
35
|
+
{
|
|
36
|
+
"mcpServers": {
|
|
37
|
+
"ledgerfc": {
|
|
38
|
+
"command": "npx",
|
|
39
|
+
"args": ["-y", "@inbin/ledgerfc-mcp"]
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
No API key needed for the free tools. That is it.
|
|
46
|
+
|
|
47
|
+
### Or connect the remote directly (clients that support remote MCP)
|
|
48
|
+
|
|
49
|
+
```
|
|
50
|
+
https://mcp.ledgerfc.com/mcp
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## Tools
|
|
54
|
+
|
|
55
|
+
Free (no key):
|
|
56
|
+
|
|
57
|
+
- `get_track_record` — honest settled record + high-confidence subset + CLV
|
|
58
|
+
- `get_predictions` — upcoming picks with probabilities and model-vs-market edge (filter by league)
|
|
59
|
+
- `search` / `fetch` — query upcoming match predictions, fetch the full doc
|
|
60
|
+
- `get_leaderboard`, `submit_prediction`, `get_contributor_score` — CLV-scored contributor layer (points, not cash)
|
|
61
|
+
- `place_bet`, `get_balance`, `get_my_bets`, `get_bet` — shadow bet ledger to test strategies against our agent (points only)
|
|
62
|
+
|
|
63
|
+
Pro (pass `api_key` as a tool argument; get one with `/key` in the Ledger FC Telegram bot):
|
|
64
|
+
|
|
65
|
+
- `get_arbs` — live detected arbitrage opportunities
|
|
66
|
+
- `get_value_bets` — upcoming picks with positive model-vs-market edge
|
|
67
|
+
|
|
68
|
+
## Example
|
|
69
|
+
|
|
70
|
+
Ask your agent: "Use ledgerfc to get the track record and the top 3 upcoming
|
|
71
|
+
predictions with the biggest edge." It calls `get_track_record` and
|
|
72
|
+
`get_predictions`, and answers from real numbers with provenance, not a guess.
|
|
73
|
+
|
|
74
|
+
## How it works
|
|
75
|
+
|
|
76
|
+
This npm package is a tiny stdio-to-HTTP bridge: it reads JSON-RPC from your MCP
|
|
77
|
+
client on stdin and forwards each request to the remote endpoint
|
|
78
|
+
`https://mcp.ledgerfc.com/mcp`. No dependencies, Node 18+. Set `LEDGERFC_MCP_DEBUG=1`
|
|
79
|
+
to log traffic to stderr, or `LEDGERFC_MCP_URL` to point at a different endpoint.
|
|
80
|
+
|
|
81
|
+
## Links
|
|
82
|
+
|
|
83
|
+
- Site: https://ledgerfc.com
|
|
84
|
+
- Telegram (free channel + Pro key): https://t.me/ledgerfc
|
|
85
|
+
|
|
86
|
+
MIT licensed. Ledger FC is an information tool, not betting advice. 18+.
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// src/index.ts
|
|
4
|
+
import { createInterface } from "node:readline";
|
|
5
|
+
var ENDPOINT = process.env["LEDGERFC_MCP_URL"] || "https://mcp.ledgerfc.com/mcp";
|
|
6
|
+
var DEBUG = process.env["LEDGERFC_MCP_DEBUG"] === "1";
|
|
7
|
+
function debug(...args) {
|
|
8
|
+
if (DEBUG) console.error("[ledgerfc-mcp]", ...args);
|
|
9
|
+
}
|
|
10
|
+
var pending = 0;
|
|
11
|
+
var stdinClosed = false;
|
|
12
|
+
function maybeExit() {
|
|
13
|
+
if (stdinClosed && pending === 0) process.exit(0);
|
|
14
|
+
}
|
|
15
|
+
async function forward(line) {
|
|
16
|
+
const trimmed = line.trim();
|
|
17
|
+
if (!trimmed) return;
|
|
18
|
+
let parsed;
|
|
19
|
+
try {
|
|
20
|
+
parsed = JSON.parse(trimmed);
|
|
21
|
+
} catch {
|
|
22
|
+
debug("dropped non-JSON line from stdin");
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
const isNotification = parsed.id === void 0;
|
|
26
|
+
pending++;
|
|
27
|
+
try {
|
|
28
|
+
debug("\u2192 POST", parsed.method);
|
|
29
|
+
const res = await fetch(ENDPOINT, {
|
|
30
|
+
method: "POST",
|
|
31
|
+
headers: {
|
|
32
|
+
"content-type": "application/json",
|
|
33
|
+
// The remote speaks Streamable HTTP; accept both JSON and SSE framing.
|
|
34
|
+
accept: "application/json, text/event-stream",
|
|
35
|
+
"user-agent": "ledgerfc-mcp-stdio/0.1.0"
|
|
36
|
+
},
|
|
37
|
+
body: trimmed
|
|
38
|
+
});
|
|
39
|
+
debug("\u2190 status", res.status);
|
|
40
|
+
if (res.status === 202 || isNotification) return;
|
|
41
|
+
const body = await res.text();
|
|
42
|
+
if (body) {
|
|
43
|
+
process.stdout.write(body);
|
|
44
|
+
if (!body.endsWith("\n")) process.stdout.write("\n");
|
|
45
|
+
}
|
|
46
|
+
} catch (err) {
|
|
47
|
+
const message = err instanceof Error ? err.message : "network error";
|
|
48
|
+
debug("!", message);
|
|
49
|
+
if (!isNotification && typeof parsed.id !== "undefined") {
|
|
50
|
+
const out = {
|
|
51
|
+
jsonrpc: "2.0",
|
|
52
|
+
id: parsed.id ?? null,
|
|
53
|
+
error: {
|
|
54
|
+
code: -32603,
|
|
55
|
+
message: `ledgerfc-mcp proxy error: ${message}`
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
process.stdout.write(JSON.stringify(out) + "\n");
|
|
59
|
+
}
|
|
60
|
+
} finally {
|
|
61
|
+
pending--;
|
|
62
|
+
maybeExit();
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
var rl = createInterface({ input: process.stdin, crlfDelay: Infinity });
|
|
66
|
+
rl.on("line", (line) => {
|
|
67
|
+
forward(line);
|
|
68
|
+
});
|
|
69
|
+
rl.on("close", () => {
|
|
70
|
+
stdinClosed = true;
|
|
71
|
+
maybeExit();
|
|
72
|
+
});
|
|
73
|
+
process.on("uncaughtException", (err) => debug("uncaught:", err));
|
|
74
|
+
process.on("unhandledRejection", (err) => debug("unhandled:", err));
|
package/package.json
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@inbin/ledgerfc-mcp",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Stdio MCP wrapper for Ledger FC — gives Claude Desktop and other stdio-only MCP clients grounded sports predictions plus European soccer and tennis arbitrage data from Ledger FC's remote HTTP MCP endpoint. Free tools need no key.",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"mcp",
|
|
7
|
+
"model-context-protocol",
|
|
8
|
+
"ledgerfc",
|
|
9
|
+
"sports",
|
|
10
|
+
"predictions",
|
|
11
|
+
"arbitrage",
|
|
12
|
+
"soccer",
|
|
13
|
+
"football",
|
|
14
|
+
"tennis",
|
|
15
|
+
"kalshi",
|
|
16
|
+
"stdio",
|
|
17
|
+
"cli"
|
|
18
|
+
],
|
|
19
|
+
"homepage": "https://ledgerfc.com",
|
|
20
|
+
"bugs": "https://ledgerfc.com/",
|
|
21
|
+
"license": "MIT",
|
|
22
|
+
"author": "Ledger FC",
|
|
23
|
+
"repository": {
|
|
24
|
+
"type": "git",
|
|
25
|
+
"url": "https://github.com/yaotsakpo/ledgerfc-mcp.git"
|
|
26
|
+
},
|
|
27
|
+
"type": "module",
|
|
28
|
+
"bin": {
|
|
29
|
+
"ledgerfc-mcp": "./dist/index.js"
|
|
30
|
+
},
|
|
31
|
+
"main": "./dist/index.js",
|
|
32
|
+
"files": [
|
|
33
|
+
"dist",
|
|
34
|
+
"README.md",
|
|
35
|
+
"server.json"
|
|
36
|
+
],
|
|
37
|
+
"engines": {
|
|
38
|
+
"node": ">=18"
|
|
39
|
+
},
|
|
40
|
+
"mcpName": "io.github.yaotsakpo/ledgerfc",
|
|
41
|
+
"scripts": {
|
|
42
|
+
"build": "esbuild src/index.ts --bundle --platform=node --format=esm --target=node18 --outfile=dist/index.js --banner:js='#!/usr/bin/env node' && chmod +x dist/index.js",
|
|
43
|
+
"prepublishOnly": "npm run build"
|
|
44
|
+
},
|
|
45
|
+
"devDependencies": {
|
|
46
|
+
"@types/node": "^20.0.0",
|
|
47
|
+
"esbuild": "^0.24.0",
|
|
48
|
+
"typescript": "^5.4.0"
|
|
49
|
+
}
|
|
50
|
+
}
|
package/server.json
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://static.modelcontextprotocol.io/schemas/2025-09-29/server.schema.json",
|
|
3
|
+
"name": "io.github.yaotsakpo/ledgerfc",
|
|
4
|
+
"description": "Grounded sports predictions plus European soccer and tennis arbitrage data for AI agents. Honest tracked record, closing-line value, and model-vs-market edge. Free tools need no key.",
|
|
5
|
+
"repository": {
|
|
6
|
+
"url": "https://github.com/yaotsakpo/ledgerfc-mcp",
|
|
7
|
+
"source": "github"
|
|
8
|
+
},
|
|
9
|
+
"version": "0.1.0",
|
|
10
|
+
"packages": [
|
|
11
|
+
{
|
|
12
|
+
"registryType": "npm",
|
|
13
|
+
"registryBaseUrl": "https://registry.npmjs.org",
|
|
14
|
+
"identifier": "@inbin/ledgerfc-mcp",
|
|
15
|
+
"version": "0.1.0",
|
|
16
|
+
"transport": {
|
|
17
|
+
"type": "stdio"
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
],
|
|
21
|
+
"remotes": [
|
|
22
|
+
{
|
|
23
|
+
"type": "streamable-http",
|
|
24
|
+
"url": "https://mcp.ledgerfc.com/mcp"
|
|
25
|
+
}
|
|
26
|
+
]
|
|
27
|
+
}
|