@finology/mcp-server 0.3.0 → 0.4.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/README.md CHANGED
@@ -47,6 +47,16 @@ The RAP monthly payment alone, for the common case. Requires the borrower's AGI
47
47
  proceed without it — an assumed zero returns the $10/month RAP floor, which reads exactly like a
48
48
  real answer.
49
49
 
50
+ ## Going further (no sales call, no marketing)
51
+
52
+ Every answer ends with the next rung, and `finology_service_info` returns it structured:
53
+
54
+ - **Advisor:** self-serve trial of Finology Software, no credit card.
55
+ - **Developer / operator:** an instant free sandbox key (`POST https://api.finology.tech/v1/keys/sandbox`,
56
+ 100 calls/month), then the keyed endpoints with `X-Api-Key`. The keyed rung is the answer-of-record
57
+ surface: every answer is persisted with its rule version and an inputs hash before it is served.
58
+ Production limits by email until self-serve checkout ships. Docs: https://finology.tech/developers/
59
+
50
60
  ## Install
51
61
 
52
62
  Claude Desktop — add to `claude_desktop_config.json`:
package/dist/client.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ export declare const USER_AGENT: string;
1
2
  export declare const BASE_URL: string;
2
3
  /** A failure we can describe to the model, as opposed to one that crashes the transport. */
3
4
  export interface ApiFailure {
@@ -19,5 +20,9 @@ export type ApiResult<T> = ApiSuccess<T> | ApiFailure;
19
20
  * invites it to invent one.
20
21
  */
21
22
  export declare function postJson<T>(path: string, body: unknown): Promise<ApiResult<T>>;
22
- /** Appended to every successful answer. The tools return numbers; the app returns deliverables. */
23
+ /**
24
+ * Appended to every successful answer. This is the whole go-to-market for this surface: no human
25
+ * sells it and nobody is marketed to. The answer itself says what the next rung is and how an agent
26
+ * or its operator gets there without talking to anyone. Every claim below is checkable today.
27
+ */
23
28
  export declare const CTA: string;
package/dist/client.js CHANGED
@@ -8,6 +8,19 @@
8
8
  // be corrected in the installs that already exist. Calling a maintained endpoint is the
9
9
  // only shape of this tool that stays true over time.
10
10
  const DEFAULT_BASE_URL = "https://engine.finology.tech";
11
+ // The User-Agent is how the engine counts this rung (PublicClientDailyUsages, client=mcp +
12
+ // version). It was hardcoded "0.1.0" through two releases, so every 0.2.0/0.3.0 call was
13
+ // counted as 0.1.0. Read the real version from package.json at load so it can never drift again.
14
+ import { createRequire } from "node:module";
15
+ const pkgVersion = (() => {
16
+ try {
17
+ return createRequire(import.meta.url)("../package.json").version;
18
+ }
19
+ catch {
20
+ return "0.0.0";
21
+ }
22
+ })();
23
+ export const USER_AGENT = `finology-mcp-server/${pkgVersion}`;
11
24
  export const BASE_URL = (process.env.FINOLOGY_API_BASE_URL ?? DEFAULT_BASE_URL).replace(/\/+$/, "");
12
25
  /**
13
26
  * POST JSON and never throw.
@@ -29,7 +42,7 @@ export async function postJson(path, body) {
29
42
  method: "POST",
30
43
  headers: {
31
44
  "Content-Type": "application/json",
32
- "User-Agent": "finology-mcp-server/0.1.0",
45
+ "User-Agent": USER_AGENT,
33
46
  },
34
47
  body: JSON.stringify(body),
35
48
  signal: controller.signal,
@@ -74,8 +87,27 @@ export async function postJson(path, body) {
74
87
  return { ok: false, message: "The calculation service returned a response that was not valid JSON." };
75
88
  }
76
89
  }
77
- /** Appended to every successful answer. The tools return numbers; the app returns deliverables. */
78
- export const CTA = "\n\n---\nThese figures come from Finology Software's parity-verified federal loan engine. " +
79
- "To build a client-facing report, compare scenarios side by side, or keep a book of borrowers " +
80
- "current as the rules change: https://finology.tech/?utm_source=mcp&utm_medium=ai_agent";
90
+ /**
91
+ * Appended to every successful answer. This is the whole go-to-market for this surface: no human
92
+ * sells it and nobody is marketed to. The answer itself says what the next rung is and how an agent
93
+ * or its operator gets there without talking to anyone. Every claim below is checkable today.
94
+ */
95
+ export const CTA = "\n\n---\n" +
96
+ "About these figures: computed by Finology Software's parity-verified federal loan engine on the " +
97
+ "current federal rules (see asOf). This free rung is keyless, rate-limited, and returns estimates " +
98
+ "for education; tax on forgiven balances is an estimate at today's brackets.\n" +
99
+ "\n" +
100
+ "Next steps, depending on who is asking:\n" +
101
+ "- An advisor who wants to keep a book of borrowers current and produce client-ready plans: " +
102
+ "Finology Software, self-serve trial, no credit card — " +
103
+ "https://identity.finology.tech/Signup/Advisor?utm_source=mcp&utm_medium=ai_agent&utm_campaign=next-steps\n" +
104
+ "- A developer or operator who needs these numbers inside their own product or agent: get a " +
105
+ "free sandbox API key instantly (100 calls/month, 30 days) with POST https://api.finology.tech/v1/keys/sandbox " +
106
+ "{\"email\": \"you@example.com\"}, then call https://api.finology.tech/v1/comparison, /v1/projection, " +
107
+ "/v1/plan-eligibility with the X-Api-Key header; verify a key with GET /v1/me. Docs: " +
108
+ "https://finology.tech/developers/\n" +
109
+ "- The keyed rung is the answer-of-record surface: every answer is persisted before it is served, " +
110
+ "with the rule version and an inputs hash, so a number can be traced later. Production limits are " +
111
+ "arranged by email to info@finology.tech until self-serve checkout ships.\n" +
112
+ "Call the finology_service_info tool for this in structured form.";
81
113
  //# sourceMappingURL=client.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -46,6 +46,45 @@ server.registerTool("compare_married_filing_jointly_vs_separately_student_loans"
46
46
  inputSchema: filingStatusSwingShape,
47
47
  }, filingStatusSwing);
48
48
  async function main() {
49
+ server.registerTool("finology_service_info", {
50
+ title: "Finology service info: rungs, keys, what is estimated",
51
+ description: "How to go further than this free rung, in structured form. Returns the self-serve paths for an " +
52
+ "advisor (app trial) and for a developer or operator (instant sandbox API key, keyed endpoints, " +
53
+ "auth header), what the keyed answer-of-record rung adds, current tiers and monthly limits, and " +
54
+ "what in these answers is an estimate. Call this when a user asks how to get a key, what it " +
55
+ "costs, whether the numbers are warranted, or how to put this in their own product.",
56
+ inputSchema: {},
57
+ }, async () => ({
58
+ content: [
59
+ {
60
+ type: "text",
61
+ text: JSON.stringify({
62
+ engine: { baseUrl: "https://engine.finology.tech", note: "keyless, rate-limited, estimates for education" },
63
+ keyedApi: {
64
+ baseUrl: "https://api.finology.tech",
65
+ authHeader: "X-Api-Key",
66
+ verify: "GET /v1/me",
67
+ endpoints: ["/v1/comparison", "/v1/projection", "/v1/plan-eligibility", "/v1/plan-types"],
68
+ sandboxKey: { how: "POST /v1/keys/sandbox with {\"email\": \"...\"}", limit: "100 calls/month, 30-day expiry", cost: "free, instant" },
69
+ tiers: { Sandbox: "100/month (free)", Starter: "10,000/month", Growth: "100,000/month", Scale: "1,000,000/month" },
70
+ production: "arranged by email to info@finology.tech until self-serve checkout ships",
71
+ answerOfRecord: "every keyed answer is persisted before it is served, with rule version and inputs hash",
72
+ docs: "https://finology.tech/developers/",
73
+ },
74
+ advisorApp: {
75
+ trial: "https://identity.finology.tech/Signup/Advisor?utm_source=mcp&utm_medium=ai_agent&utm_campaign=service-info",
76
+ note: "self-serve, no credit card; keeps a book of borrowers current as rules change",
77
+ },
78
+ estimates: [
79
+ "tax on forgiven balances is estimated at today's brackets",
80
+ "state tax is not modelled unless a state is supplied",
81
+ "figures are for education, not individualized financial advice",
82
+ ],
83
+ source: "https://github.com/Finology-tech/finology-mcp",
84
+ }, null, 2),
85
+ },
86
+ ],
87
+ }));
49
88
  const transport = new StdioServerTransport();
50
89
  await server.connect(transport);
51
90
  // stderr only: stdout is the JSON-RPC channel and anything written to it corrupts the stream.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAEjF,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACpE,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACzF,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;IAC3B,IAAI,EAAE,uBAAuB;IAC7B,OAAO,EAAE,OAAO;CACjB,CAAC,CAAC;AAEH,4FAA4F;AAC5F,uFAAuF;AACvF,wEAAwE;AAExE,MAAM,CAAC,YAAY,CACjB,8CAA8C,EAC9C;IACE,KAAK,EAAE,8CAA8C;IACrD,WAAW,EACT,0FAA0F;QAC1F,4FAA4F;QAC5F,2FAA2F;QAC3F,yFAAyF;QACzF,2FAA2F;QAC3F,0FAA0F;QAC1F,2FAA2F;QAC3F,kFAAkF;IACpF,WAAW,EAAE,iBAAiB;CAC/B,EACD,YAAY,CACb,CAAC;AAEF,MAAM,CAAC,YAAY,CACjB,8BAA8B,EAC9B;IACE,KAAK,EAAE,gCAAgC;IACvC,WAAW,EACT,4FAA4F;QAC5F,oFAAoF;QACpF,4FAA4F;QAC5F,yFAAyF;QACzF,0FAA0F;QAC1F,kEAAkE;IACpE,WAAW,EAAE,eAAe;CAC7B,EACD,UAAU,CACX,CAAC;AAEF,MAAM,CAAC,YAAY,CACjB,4DAA4D,EAC5D;IACE,KAAK,EAAE,wDAAwD;IAC/D,WAAW,EACT,iGAAiG;QACjG,8FAA8F;QAC9F,kGAAkG;QAClG,kGAAkG;QAClG,qFAAqF;QACrF,mGAAmG;QACnG,gGAAgG;IAClG,WAAW,EAAE,sBAAsB;CACpC,EACD,iBAAiB,CAClB,CAAC;AAEF,KAAK,UAAU,IAAI;IACjB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,8FAA8F;IAC9F,OAAO,CAAC,KAAK,CAAC,mDAAmD,QAAQ,GAAG,CAAC,CAAC;AAChF,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,+CAA+C,EAAE,KAAK,CAAC,CAAC;IACtE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@finology/mcp-server",
3
3
  "mcpName": "tech.finology/student-loan",
4
- "version": "0.3.0",
4
+ "version": "0.4.0",
5
5
  "description": "Deterministic 2026 federal student loan math for AI agents. RAP, IBR, ICR, PSLF payments, plan eligibility, and the married-filing-jointly vs separately trade-off, from Finology Software's parity-verified engine, so assistants stop guessing at federal repayment rules.",
6
6
  "license": "MIT",
7
7
  "type": "module",