@ekoindia/eps-context-mcp 0.1.22 → 0.1.24
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 +10 -1
- package/data/eps.json +615 -16
- package/dist/index.js +45 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -72,12 +72,21 @@ clients can see this programmatically.
|
|
|
72
72
|
| `get_topic` | `topic` (`auth` \| `errors` \| `pricing` \| `environments`) | One documentation topic. |
|
|
73
73
|
| `get_recipe` | `id` | One multi-step recipe (steps + branches). |
|
|
74
74
|
| `get_signing_snippet` | `language` (`php` \| `java` \| `csharp` \| `javascript` \| `python` \| `go`) | Paste-ready **backend** code to compute the request `secret-key`. |
|
|
75
|
+
| `list_sdks` | — | The backend SDKs that wrap every endpoint: language, package, install command, minimum runtime, docs URL. Compact — no members or examples. |
|
|
76
|
+
| `get_sdk` | `language` (`javascript` \| `python` \| `php` \| `go` \| `java`; the guide slug such as `nodejs` also works) | One SDK in full: install + requirements, client config options with units, every public class/method/type, file-upload values, the error and timeout contract, and a worked `call()` example. |
|
|
75
77
|
| `debug_auth` | `timestamp?`, `secret_key?` | Diagnose a `403`: returns a known-answer test vector to check your signing against, mechanical checks on a supplied timestamp/signature, and ranked causes. **Never takes an `access_key`.** |
|
|
76
78
|
| `get_meta` | — | Bundle org/version, data source (`baked` or `remote`), this server's `packageVersion`, and `updateAvailable` (whether a newer npm release exists). |
|
|
77
79
|
|
|
78
80
|
**Tiered usage:** start with `list_apis` / `search` (cheap, compact), then call
|
|
79
81
|
`get_api` only for the endpoint(s) you actually need. Same pattern for
|
|
80
|
-
`list_topics` → `get_topic
|
|
82
|
+
`list_topics` → `get_topic`, `list_recipes` → `get_recipe` and
|
|
83
|
+
`list_sdks` → `get_sdk`.
|
|
84
|
+
|
|
85
|
+
**Reach for an SDK first.** When the target language has one, `get_sdk` gives
|
|
86
|
+
you install, client construction and the call pattern with signing, param
|
|
87
|
+
validation and the error contract already handled — do not hand-roll the HMAC
|
|
88
|
+
`secret-key`. `get_signing_snippet` is for the languages with no SDK (it covers
|
|
89
|
+
`csharp` too) and for debugging a `403`.
|
|
81
90
|
|
|
82
91
|
**Errors are actionable:** an unknown `slug`/`id` returns an MCP error result
|
|
83
92
|
(`isError: true`) with "did you mean" suggestions and a pointer to
|
package/data/eps.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"meta": {
|
|
3
3
|
"org": "ekoindia",
|
|
4
4
|
"apiVersion": "v3",
|
|
5
|
-
"bundleVersion": "
|
|
5
|
+
"bundleVersion": "4b18a8ba",
|
|
6
6
|
"environments": [
|
|
7
7
|
{
|
|
8
8
|
"id": "sandbox",
|
|
@@ -18803,15 +18803,15 @@
|
|
|
18803
18803
|
"name": "vehicle_number",
|
|
18804
18804
|
"type": "string",
|
|
18805
18805
|
"required": true,
|
|
18806
|
-
"description": "Vehicle registration number to verify (e.g.
|
|
18807
|
-
"example": "
|
|
18806
|
+
"description": "Vehicle registration number to verify (e.g. HJ01ME5678).",
|
|
18807
|
+
"example": "HJ01ME5678",
|
|
18808
18808
|
"in": "body"
|
|
18809
18809
|
}
|
|
18810
18810
|
],
|
|
18811
18811
|
"sampleRequest": {
|
|
18812
18812
|
"initiator_id": "9962981729",
|
|
18813
18813
|
"client_ref_id": "2026010100123456789",
|
|
18814
|
-
"vehicle_number": "
|
|
18814
|
+
"vehicle_number": "HJ01ME5678"
|
|
18815
18815
|
},
|
|
18816
18816
|
"responseFields": [
|
|
18817
18817
|
{
|
|
@@ -18847,7 +18847,7 @@
|
|
|
18847
18847
|
"name": "reference_id",
|
|
18848
18848
|
"type": "string",
|
|
18849
18849
|
"description": "Unique reference ID for this verification request returned by Eko.",
|
|
18850
|
-
"example": "
|
|
18850
|
+
"example": "34247643"
|
|
18851
18851
|
},
|
|
18852
18852
|
{
|
|
18853
18853
|
"name": "status",
|
|
@@ -20364,23 +20364,14 @@
|
|
|
20364
20364
|
"type": "string",
|
|
20365
20365
|
"required": true,
|
|
20366
20366
|
"description": "Unique Electoral Photo Identity Card (EPIC) number to verify.",
|
|
20367
|
-
"example": "
|
|
20368
|
-
"in": "body"
|
|
20369
|
-
},
|
|
20370
|
-
{
|
|
20371
|
-
"name": "name",
|
|
20372
|
-
"type": "string",
|
|
20373
|
-
"required": false,
|
|
20374
|
-
"description": "Name of the Voter ID cardholder. Optional; can be used for cross-verification against returned name.",
|
|
20375
|
-
"example": "Rajesh Kumar",
|
|
20367
|
+
"example": "UAI4574761",
|
|
20376
20368
|
"in": "body"
|
|
20377
20369
|
}
|
|
20378
20370
|
],
|
|
20379
20371
|
"sampleRequest": {
|
|
20380
20372
|
"initiator_id": "9962981729",
|
|
20381
20373
|
"client_ref_id": "2026010100123456789",
|
|
20382
|
-
"epic_number": "
|
|
20383
|
-
"name": "Rajesh Kumar"
|
|
20374
|
+
"epic_number": "UAI4574761"
|
|
20384
20375
|
},
|
|
20385
20376
|
"responseFields": [
|
|
20386
20377
|
{
|
|
@@ -23556,5 +23547,613 @@
|
|
|
23556
23547
|
}
|
|
23557
23548
|
]
|
|
23558
23549
|
}
|
|
23550
|
+
],
|
|
23551
|
+
"sdks": [
|
|
23552
|
+
{
|
|
23553
|
+
"lang": "javascript",
|
|
23554
|
+
"slug": "nodejs",
|
|
23555
|
+
"title": "Node.js SDK",
|
|
23556
|
+
"summary": "Backend-only Node.js client for every EPS API, with HMAC signing, input validation and typed errors built in.",
|
|
23557
|
+
"packageName": "@ekoindia/eps-sdk",
|
|
23558
|
+
"installCommand": "npm i @ekoindia/eps-sdk",
|
|
23559
|
+
"registry": "npm",
|
|
23560
|
+
"registryUrl": "https://www.npmjs.com/package/@ekoindia/eps-sdk",
|
|
23561
|
+
"minRuntime": "Node.js 18 or newer",
|
|
23562
|
+
"dependencies": "None — standard library only (`node:crypto`, global `fetch`).",
|
|
23563
|
+
"sourceUrl": "https://github.com/ekoindia/eps-platform/tree/main/packages/sdk-js",
|
|
23564
|
+
"docsUrl": "https://eps.eko.in/docs/sdk/nodejs",
|
|
23565
|
+
"config": [
|
|
23566
|
+
{
|
|
23567
|
+
"name": "developerKey",
|
|
23568
|
+
"type": "string",
|
|
23569
|
+
"required": true,
|
|
23570
|
+
"description": "Your EPS developer key, sent as the `developer_key` header."
|
|
23571
|
+
},
|
|
23572
|
+
{
|
|
23573
|
+
"name": "accessKey",
|
|
23574
|
+
"type": "string",
|
|
23575
|
+
"required": true,
|
|
23576
|
+
"description": "Server-side secret used to sign every request. Never ships to a browser."
|
|
23577
|
+
},
|
|
23578
|
+
{
|
|
23579
|
+
"name": "environment",
|
|
23580
|
+
"type": "\"sandbox\" | \"production\"",
|
|
23581
|
+
"required": true,
|
|
23582
|
+
"description": "Selects the base URL from the embedded surface."
|
|
23583
|
+
},
|
|
23584
|
+
{
|
|
23585
|
+
"name": "initiatorId",
|
|
23586
|
+
"type": "string",
|
|
23587
|
+
"required": false,
|
|
23588
|
+
"description": "Default `initiator_id` (registered mobile of the API user) injected into every call."
|
|
23589
|
+
},
|
|
23590
|
+
{
|
|
23591
|
+
"name": "userCode",
|
|
23592
|
+
"type": "string",
|
|
23593
|
+
"required": false,
|
|
23594
|
+
"description": "Default `user_code` (retailer/agent code) injected into every call."
|
|
23595
|
+
},
|
|
23596
|
+
{
|
|
23597
|
+
"name": "timeoutMs",
|
|
23598
|
+
"type": "number",
|
|
23599
|
+
"required": false,
|
|
23600
|
+
"units": "milliseconds, default 30_000",
|
|
23601
|
+
"description": "Aborts a request that takes longer. Named for its unit — Python and PHP use seconds."
|
|
23602
|
+
},
|
|
23603
|
+
{
|
|
23604
|
+
"name": "fetch",
|
|
23605
|
+
"type": "typeof fetch",
|
|
23606
|
+
"required": false,
|
|
23607
|
+
"description": "Inject a custom fetch implementation (proxies, tests)."
|
|
23608
|
+
}
|
|
23609
|
+
],
|
|
23610
|
+
"members": [
|
|
23611
|
+
{
|
|
23612
|
+
"kind": "class",
|
|
23613
|
+
"name": "EpsClient",
|
|
23614
|
+
"signature": "new EpsClient(options: EpsClientOptions)",
|
|
23615
|
+
"description": "The client. Throws immediately if constructed where `window` exists — `accessKey` must never reach a browser."
|
|
23616
|
+
},
|
|
23617
|
+
{
|
|
23618
|
+
"kind": "method",
|
|
23619
|
+
"name": "call",
|
|
23620
|
+
"signature": "client.call<T = unknown>(slug: string, params?: Record<string, unknown>): Promise<T>",
|
|
23621
|
+
"description": "Validates, signs and sends one endpoint call; resolves with the decoded envelope."
|
|
23622
|
+
},
|
|
23623
|
+
{
|
|
23624
|
+
"kind": "function",
|
|
23625
|
+
"name": "signSecretKey",
|
|
23626
|
+
"signature": "signSecretKey(accessKey: string, timestamp: string): string",
|
|
23627
|
+
"description": "The raw signing primitive, exported for debugging. `call()` applies it for you."
|
|
23628
|
+
},
|
|
23629
|
+
{
|
|
23630
|
+
"kind": "constant",
|
|
23631
|
+
"name": "MULTIPART_JSON_FIELD",
|
|
23632
|
+
"signature": "MULTIPART_JSON_FIELD = \"form-data\"",
|
|
23633
|
+
"description": "Name of the single form field carrying the JSON envelope on file-upload endpoints."
|
|
23634
|
+
},
|
|
23635
|
+
{
|
|
23636
|
+
"kind": "type",
|
|
23637
|
+
"name": "EpsClientOptions",
|
|
23638
|
+
"signature": "interface EpsClientOptions",
|
|
23639
|
+
"description": "The constructor options above."
|
|
23640
|
+
},
|
|
23641
|
+
{
|
|
23642
|
+
"kind": "type",
|
|
23643
|
+
"name": "SdkEndpoint / SdkParam",
|
|
23644
|
+
"signature": "interface SdkEndpoint, interface SdkParam",
|
|
23645
|
+
"description": "Shape of one endpoint in the embedded surface (slug, method, path, params)."
|
|
23646
|
+
}
|
|
23647
|
+
],
|
|
23648
|
+
"errorTypes": [
|
|
23649
|
+
{
|
|
23650
|
+
"name": "EpsHttpError",
|
|
23651
|
+
"when": "Any non-2xx response.",
|
|
23652
|
+
"fields": "`status`, `url`, `body` (decoded envelope or null), `raw`"
|
|
23653
|
+
},
|
|
23654
|
+
{
|
|
23655
|
+
"name": "EpsError",
|
|
23656
|
+
"when": "Unknown slug, missing required param, wrong param type, bad option, or a 2xx body that is not JSON. `EpsHttpError` extends it."
|
|
23657
|
+
},
|
|
23658
|
+
{
|
|
23659
|
+
"name": "TimeoutError (DOMException)",
|
|
23660
|
+
"when": "The request exceeded `timeoutMs`. Surfaced raw, as Node reports it."
|
|
23661
|
+
}
|
|
23662
|
+
],
|
|
23663
|
+
"fileValues": [
|
|
23664
|
+
"A local file path (read from disk; the filename is the basename)",
|
|
23665
|
+
"A `Blob` or `File` (a `File` keeps its own name)"
|
|
23666
|
+
],
|
|
23667
|
+
"notes": [
|
|
23668
|
+
"ESM only (`\"type\": \"module\"`). Use `import`, or `await import()` from CommonJS.",
|
|
23669
|
+
"A per-call cancellation signal is not supported yet — `timeoutMs` is the only abort source."
|
|
23670
|
+
],
|
|
23671
|
+
"example": "import { EpsClient } from \"@ekoindia/eps-sdk\";\n\nconst client = new EpsClient({\n developerKey: process.env.EPS_DEVELOPER_KEY,\n accessKey: process.env.EPS_ACCESS_KEY,\n initiatorId: \"9962981729\",\n environment: \"sandbox\",\n});\n\nconst result = await client.call(\"pan-lite\", {\n \"pan_number\": \"ABCDE1234F\",\n \"name\": \"Rajesh Kumar\",\n \"dob\": \"1994-08-29\"\n});\nconsole.log(result);"
|
|
23672
|
+
},
|
|
23673
|
+
{
|
|
23674
|
+
"lang": "python",
|
|
23675
|
+
"slug": "python",
|
|
23676
|
+
"title": "Python SDK",
|
|
23677
|
+
"summary": "Backend-only Python client for every EPS API, dependency-free and typed, with HMAC signing built in.",
|
|
23678
|
+
"packageName": "eps-sdk",
|
|
23679
|
+
"installCommand": "pip install eps-sdk",
|
|
23680
|
+
"registry": "PyPI",
|
|
23681
|
+
"registryUrl": "https://pypi.org/project/eps-sdk/",
|
|
23682
|
+
"minRuntime": "Python 3.9 or newer",
|
|
23683
|
+
"dependencies": "None — standard library only (`urllib`, `hmac`, `hashlib`, `mimetypes`).",
|
|
23684
|
+
"sourceUrl": "https://github.com/ekoindia/eps-platform/tree/main/packages/sdk-python",
|
|
23685
|
+
"docsUrl": "https://eps.eko.in/docs/sdk/python",
|
|
23686
|
+
"config": [
|
|
23687
|
+
{
|
|
23688
|
+
"name": "developer_key",
|
|
23689
|
+
"type": "str",
|
|
23690
|
+
"required": true,
|
|
23691
|
+
"description": "Your EPS developer key, sent as the `developer_key` header."
|
|
23692
|
+
},
|
|
23693
|
+
{
|
|
23694
|
+
"name": "access_key",
|
|
23695
|
+
"type": "str",
|
|
23696
|
+
"required": true,
|
|
23697
|
+
"description": "Server-side secret used to sign every request. Never ships to a browser."
|
|
23698
|
+
},
|
|
23699
|
+
{
|
|
23700
|
+
"name": "environment",
|
|
23701
|
+
"type": "\"sandbox\" | \"production\"",
|
|
23702
|
+
"required": true,
|
|
23703
|
+
"description": "Selects the base URL from the embedded surface."
|
|
23704
|
+
},
|
|
23705
|
+
{
|
|
23706
|
+
"name": "initiator_id",
|
|
23707
|
+
"type": "str",
|
|
23708
|
+
"required": false,
|
|
23709
|
+
"description": "Default `initiator_id` (registered mobile of the API user) injected into every call."
|
|
23710
|
+
},
|
|
23711
|
+
{
|
|
23712
|
+
"name": "user_code",
|
|
23713
|
+
"type": "str",
|
|
23714
|
+
"required": false,
|
|
23715
|
+
"description": "Default `user_code` (retailer/agent code) injected into every call."
|
|
23716
|
+
},
|
|
23717
|
+
{
|
|
23718
|
+
"name": "timeout",
|
|
23719
|
+
"type": "float",
|
|
23720
|
+
"required": false,
|
|
23721
|
+
"units": "seconds, default 30.0",
|
|
23722
|
+
"description": "Whole-request budget passed through to `urlopen`."
|
|
23723
|
+
}
|
|
23724
|
+
],
|
|
23725
|
+
"members": [
|
|
23726
|
+
{
|
|
23727
|
+
"kind": "class",
|
|
23728
|
+
"name": "EpsClient",
|
|
23729
|
+
"signature": "EpsClient(developer_key, access_key, environment, initiator_id=None, user_code=None, timeout=30.0)",
|
|
23730
|
+
"description": "The client — a dataclass, so keyword arguments read well."
|
|
23731
|
+
},
|
|
23732
|
+
{
|
|
23733
|
+
"kind": "method",
|
|
23734
|
+
"name": "call",
|
|
23735
|
+
"signature": "client.call(slug: str, params: Mapping[str, Any] | None = None) -> Any",
|
|
23736
|
+
"description": "Validates, signs and sends one endpoint call; returns the decoded envelope."
|
|
23737
|
+
},
|
|
23738
|
+
{
|
|
23739
|
+
"kind": "method",
|
|
23740
|
+
"name": "resolve_target",
|
|
23741
|
+
"signature": "client.resolve_target(slug, params=None) -> Target",
|
|
23742
|
+
"description": "The signed method/url/body/headers for a call, without sending it. Useful for debugging."
|
|
23743
|
+
},
|
|
23744
|
+
{
|
|
23745
|
+
"kind": "method",
|
|
23746
|
+
"name": "build_headers",
|
|
23747
|
+
"signature": "client.build_headers(multipart: bool = False) -> dict[str, str]",
|
|
23748
|
+
"description": "The four auth headers for a single request."
|
|
23749
|
+
},
|
|
23750
|
+
{
|
|
23751
|
+
"kind": "function",
|
|
23752
|
+
"name": "sign_secret_key",
|
|
23753
|
+
"signature": "sign_secret_key(access_key: str, timestamp: str) -> str",
|
|
23754
|
+
"description": "The raw signing primitive, exported for debugging."
|
|
23755
|
+
},
|
|
23756
|
+
{
|
|
23757
|
+
"kind": "constant",
|
|
23758
|
+
"name": "MULTIPART_JSON_FIELD",
|
|
23759
|
+
"signature": "MULTIPART_JSON_FIELD = \"form-data\"",
|
|
23760
|
+
"description": "Name of the single form field carrying the JSON envelope on file-upload endpoints."
|
|
23761
|
+
},
|
|
23762
|
+
{
|
|
23763
|
+
"kind": "type",
|
|
23764
|
+
"name": "Target",
|
|
23765
|
+
"signature": "@dataclass Target(method, url, body, headers, multipart)",
|
|
23766
|
+
"description": "What `resolve_target` returns."
|
|
23767
|
+
}
|
|
23768
|
+
],
|
|
23769
|
+
"errorTypes": [
|
|
23770
|
+
{
|
|
23771
|
+
"name": "EpsHttpError",
|
|
23772
|
+
"when": "Any non-2xx response.",
|
|
23773
|
+
"fields": "`.status`, `.url`, `.body` (decoded envelope or None), `.raw` (bytes)"
|
|
23774
|
+
},
|
|
23775
|
+
{
|
|
23776
|
+
"name": "EpsError",
|
|
23777
|
+
"when": "Unknown slug, missing required param, wrong param type, bad config, or a 2xx body that is not JSON. `EpsHttpError` subclasses it."
|
|
23778
|
+
},
|
|
23779
|
+
{
|
|
23780
|
+
"name": "urllib.error.URLError",
|
|
23781
|
+
"when": "Transport failure or timeout. Surfaced raw."
|
|
23782
|
+
}
|
|
23783
|
+
],
|
|
23784
|
+
"fileValues": [
|
|
23785
|
+
"A path `str` or `os.PathLike` (the MIME type is guessed, falling back to `application/octet-stream`)",
|
|
23786
|
+
"An in-memory `(filename, bytes)` tuple"
|
|
23787
|
+
],
|
|
23788
|
+
"notes": [
|
|
23789
|
+
"Paths are checked for existence during validation, so a typo fails before the request is signed."
|
|
23790
|
+
],
|
|
23791
|
+
"example": "import os\n\nfrom eps_sdk import EpsClient\n\nclient = EpsClient(\n developer_key=os.environ[\"EPS_DEVELOPER_KEY\"],\n access_key=os.environ[\"EPS_ACCESS_KEY\"],\n initiator_id=\"9962981729\",\n environment=\"sandbox\",\n)\n\nresult = client.call(\"pan-lite\", {\n \"pan_number\": \"ABCDE1234F\",\n \"name\": \"Rajesh Kumar\",\n \"dob\": \"1994-08-29\",\n})\nprint(result)"
|
|
23792
|
+
},
|
|
23793
|
+
{
|
|
23794
|
+
"lang": "php",
|
|
23795
|
+
"slug": "php",
|
|
23796
|
+
"title": "PHP SDK",
|
|
23797
|
+
"summary": "Backend-only PHP client for every EPS API, with HMAC signing, input validation and typed errors built in.",
|
|
23798
|
+
"packageName": "ekoindia/eps-sdk",
|
|
23799
|
+
"installCommand": "composer require ekoindia/eps-sdk",
|
|
23800
|
+
"registry": "Packagist",
|
|
23801
|
+
"registryUrl": "https://packagist.org/packages/ekoindia/eps-sdk",
|
|
23802
|
+
"minRuntime": "PHP 8.1 or newer",
|
|
23803
|
+
"dependencies": "None beyond the `curl` and `json` extensions.",
|
|
23804
|
+
"sourceUrl": "https://github.com/ekoindia/eps-platform/tree/main/packages/sdk-php",
|
|
23805
|
+
"docsUrl": "https://eps.eko.in/docs/sdk/php",
|
|
23806
|
+
"installNotes": [
|
|
23807
|
+
"Published from a read-only mirror (`ekoindia/eps-sdk-php`), subtree-split from the monorepo."
|
|
23808
|
+
],
|
|
23809
|
+
"config": [
|
|
23810
|
+
{
|
|
23811
|
+
"name": "$developerKey",
|
|
23812
|
+
"type": "string",
|
|
23813
|
+
"required": true,
|
|
23814
|
+
"description": "Your EPS developer key, sent as the `developer_key` header."
|
|
23815
|
+
},
|
|
23816
|
+
{
|
|
23817
|
+
"name": "$accessKey",
|
|
23818
|
+
"type": "string",
|
|
23819
|
+
"required": true,
|
|
23820
|
+
"description": "Server-side secret used to sign every request. Never ships to a browser."
|
|
23821
|
+
},
|
|
23822
|
+
{
|
|
23823
|
+
"name": "$environment",
|
|
23824
|
+
"type": "\"sandbox\" | \"production\"",
|
|
23825
|
+
"required": true,
|
|
23826
|
+
"description": "Selects the base URL from the embedded surface."
|
|
23827
|
+
},
|
|
23828
|
+
{
|
|
23829
|
+
"name": "$initiatorId",
|
|
23830
|
+
"type": "string",
|
|
23831
|
+
"required": false,
|
|
23832
|
+
"description": "Default `initiator_id` (registered mobile of the API user) injected into every call."
|
|
23833
|
+
},
|
|
23834
|
+
{
|
|
23835
|
+
"name": "$userCode",
|
|
23836
|
+
"type": "string",
|
|
23837
|
+
"required": false,
|
|
23838
|
+
"description": "Default `user_code` (retailer/agent code) injected into every call."
|
|
23839
|
+
},
|
|
23840
|
+
{
|
|
23841
|
+
"name": "$timeout",
|
|
23842
|
+
"type": "float",
|
|
23843
|
+
"required": false,
|
|
23844
|
+
"units": "seconds, default 30.0",
|
|
23845
|
+
"description": "Whole-request budget, applied as `CURLOPT_TIMEOUT_MS` so sub-second values are not truncated."
|
|
23846
|
+
}
|
|
23847
|
+
],
|
|
23848
|
+
"members": [
|
|
23849
|
+
{
|
|
23850
|
+
"kind": "class",
|
|
23851
|
+
"name": "Eko\\Eps\\EpsClient",
|
|
23852
|
+
"signature": "new EpsClient(string $developerKey, string $accessKey, string $environment, ?string $initiatorId = null, ?string $userCode = null, float $timeout = 30.0)",
|
|
23853
|
+
"description": "The client. Use named arguments."
|
|
23854
|
+
},
|
|
23855
|
+
{
|
|
23856
|
+
"kind": "method",
|
|
23857
|
+
"name": "call",
|
|
23858
|
+
"signature": "$client->call(string $slug, array $params = []): array",
|
|
23859
|
+
"description": "Validates, signs and sends one endpoint call; returns the decoded envelope."
|
|
23860
|
+
},
|
|
23861
|
+
{
|
|
23862
|
+
"kind": "method",
|
|
23863
|
+
"name": "resolveTarget",
|
|
23864
|
+
"signature": "$client->resolveTarget(string $slug, array $params = []): array",
|
|
23865
|
+
"description": "The signed url/body/method for a call, without sending it. Exposed for testing."
|
|
23866
|
+
},
|
|
23867
|
+
{
|
|
23868
|
+
"kind": "method",
|
|
23869
|
+
"name": "curlOptions",
|
|
23870
|
+
"signature": "$client->curlOptions(array $target): array",
|
|
23871
|
+
"description": "The cURL option map `call()` uses, including the timeout. Exposed for testing."
|
|
23872
|
+
},
|
|
23873
|
+
{
|
|
23874
|
+
"kind": "method",
|
|
23875
|
+
"name": "decodeResponse",
|
|
23876
|
+
"signature": "EpsClient::decodeResponse(int $status, string $url, string $raw): array",
|
|
23877
|
+
"description": "Static. Applies the shared response contract to one raw response — the seam the conformance tests drive."
|
|
23878
|
+
},
|
|
23879
|
+
{
|
|
23880
|
+
"kind": "method",
|
|
23881
|
+
"name": "signSecretKey",
|
|
23882
|
+
"signature": "EpsClient::signSecretKey(string $accessKey, string $timestamp): string",
|
|
23883
|
+
"description": "Static. The raw signing primitive, exposed for debugging."
|
|
23884
|
+
},
|
|
23885
|
+
{
|
|
23886
|
+
"kind": "constant",
|
|
23887
|
+
"name": "EpsClient::MULTIPART_JSON_FIELD",
|
|
23888
|
+
"signature": "const MULTIPART_JSON_FIELD = 'form-data'",
|
|
23889
|
+
"description": "Name of the single form field carrying the JSON envelope on file-upload endpoints."
|
|
23890
|
+
}
|
|
23891
|
+
],
|
|
23892
|
+
"errorTypes": [
|
|
23893
|
+
{
|
|
23894
|
+
"name": "Eko\\Eps\\EpsHttpException",
|
|
23895
|
+
"when": "Any non-2xx response.",
|
|
23896
|
+
"fields": "`->status`, `->url`, `->body` (decoded envelope or null), `->raw`"
|
|
23897
|
+
},
|
|
23898
|
+
{
|
|
23899
|
+
"name": "Eko\\Eps\\EpsException",
|
|
23900
|
+
"when": "Transport failure, a malformed surface asset, or a 2xx body that is not JSON. Extends `\\RuntimeException`."
|
|
23901
|
+
},
|
|
23902
|
+
{
|
|
23903
|
+
"name": "\\InvalidArgumentException",
|
|
23904
|
+
"when": "Unknown environment or slug, missing required param, wrong param type. SPL already has the right class, and it is a `\\LogicException`, so it cannot share a base with the runtime failures."
|
|
23905
|
+
}
|
|
23906
|
+
],
|
|
23907
|
+
"fileValues": [
|
|
23908
|
+
"A local file path (wrapped in a `CURLFile` for you)",
|
|
23909
|
+
"A `\\CURLFile` you built yourself"
|
|
23910
|
+
],
|
|
23911
|
+
"notes": [
|
|
23912
|
+
"Presence is checked with `isset()`, so a param explicitly set to `null` counts as missing — matching every other SDK."
|
|
23913
|
+
],
|
|
23914
|
+
"example": "<?php\nuse Eko\\Eps\\EpsClient;\n\n$client = new EpsClient(\n developerKey: getenv('EPS_DEVELOPER_KEY'),\n accessKey: getenv('EPS_ACCESS_KEY'),\n initiatorId: '9962981729',\n environment: 'sandbox'\n);\n\n$result = $client->call('pan-lite', [\n 'pan_number' => 'ABCDE1234F',\n 'name' => 'Rajesh Kumar',\n 'dob' => '1994-08-29'\n]);\nprint_r($result);"
|
|
23915
|
+
},
|
|
23916
|
+
{
|
|
23917
|
+
"lang": "go",
|
|
23918
|
+
"slug": "go",
|
|
23919
|
+
"title": "Go SDK",
|
|
23920
|
+
"summary": "Backend-only Go client for every EPS API — standard library only, context-aware, with HMAC signing built in.",
|
|
23921
|
+
"packageName": "github.com/ekoindia/eps-sdk-go",
|
|
23922
|
+
"installCommand": "go get github.com/ekoindia/eps-sdk-go",
|
|
23923
|
+
"registry": "Go modules",
|
|
23924
|
+
"registryUrl": "https://pkg.go.dev/github.com/ekoindia/eps-sdk-go",
|
|
23925
|
+
"minRuntime": "Go 1.22 or newer",
|
|
23926
|
+
"dependencies": "None — `go.mod` has no `require` block and there is no `go.sum`.",
|
|
23927
|
+
"sourceUrl": "https://github.com/ekoindia/eps-platform/tree/main/packages/sdk-go",
|
|
23928
|
+
"docsUrl": "https://eps.eko.in/docs/sdk/go",
|
|
23929
|
+
"installNotes": [
|
|
23930
|
+
"Published from a read-only mirror (`ekoindia/eps-sdk-go`) as a git tag; there is no separate registry."
|
|
23931
|
+
],
|
|
23932
|
+
"config": [
|
|
23933
|
+
{
|
|
23934
|
+
"name": "DeveloperKey",
|
|
23935
|
+
"type": "string",
|
|
23936
|
+
"required": true,
|
|
23937
|
+
"description": "Your EPS developer key, sent as the `developer_key` header."
|
|
23938
|
+
},
|
|
23939
|
+
{
|
|
23940
|
+
"name": "AccessKey",
|
|
23941
|
+
"type": "string",
|
|
23942
|
+
"required": true,
|
|
23943
|
+
"description": "Server-side secret used to sign every request. Never ships to a browser."
|
|
23944
|
+
},
|
|
23945
|
+
{
|
|
23946
|
+
"name": "Environment",
|
|
23947
|
+
"type": "\"sandbox\" | \"production\"",
|
|
23948
|
+
"required": true,
|
|
23949
|
+
"description": "Selects the base URL from the embedded surface."
|
|
23950
|
+
},
|
|
23951
|
+
{
|
|
23952
|
+
"name": "InitiatorID",
|
|
23953
|
+
"type": "string",
|
|
23954
|
+
"required": false,
|
|
23955
|
+
"description": "Default `initiator_id` (registered mobile of the API user) injected into every call."
|
|
23956
|
+
},
|
|
23957
|
+
{
|
|
23958
|
+
"name": "UserCode",
|
|
23959
|
+
"type": "string",
|
|
23960
|
+
"required": false,
|
|
23961
|
+
"description": "Default `user_code` (retailer/agent code) injected into every call."
|
|
23962
|
+
},
|
|
23963
|
+
{
|
|
23964
|
+
"name": "HTTPClient",
|
|
23965
|
+
"type": "*http.Client",
|
|
23966
|
+
"required": false,
|
|
23967
|
+
"units": "default: 30s timeout",
|
|
23968
|
+
"description": "Control timeouts, proxies or retries by supplying your own client."
|
|
23969
|
+
}
|
|
23970
|
+
],
|
|
23971
|
+
"members": [
|
|
23972
|
+
{
|
|
23973
|
+
"kind": "function",
|
|
23974
|
+
"name": "eps.New",
|
|
23975
|
+
"signature": "eps.New(cfg eps.Config) (*eps.Client, error)",
|
|
23976
|
+
"description": "Builds a client. Safe for concurrent use once constructed."
|
|
23977
|
+
},
|
|
23978
|
+
{
|
|
23979
|
+
"kind": "method",
|
|
23980
|
+
"name": "Call",
|
|
23981
|
+
"signature": "client.Call(ctx context.Context, slug string, params map[string]any) (map[string]any, error)",
|
|
23982
|
+
"description": "Validates, signs and sends one endpoint call. The only SDK with per-call cancellation."
|
|
23983
|
+
},
|
|
23984
|
+
{
|
|
23985
|
+
"kind": "method",
|
|
23986
|
+
"name": "ResolveTarget",
|
|
23987
|
+
"signature": "client.ResolveTarget(slug string, params map[string]any) (*eps.Target, error)",
|
|
23988
|
+
"description": "The signed request for a call, without sending it."
|
|
23989
|
+
},
|
|
23990
|
+
{
|
|
23991
|
+
"kind": "method",
|
|
23992
|
+
"name": "BuildHeaders",
|
|
23993
|
+
"signature": "client.BuildHeaders(multipartBody bool) map[string]string",
|
|
23994
|
+
"description": "The four auth headers for a single request."
|
|
23995
|
+
},
|
|
23996
|
+
{
|
|
23997
|
+
"kind": "function",
|
|
23998
|
+
"name": "eps.Sign",
|
|
23999
|
+
"signature": "eps.Sign(accessKey, timestamp string) string",
|
|
24000
|
+
"description": "The raw signing primitive, exported for debugging."
|
|
24001
|
+
},
|
|
24002
|
+
{
|
|
24003
|
+
"kind": "type",
|
|
24004
|
+
"name": "eps.File",
|
|
24005
|
+
"signature": "eps.File{Name string; Content []byte}",
|
|
24006
|
+
"description": "An in-memory upload."
|
|
24007
|
+
},
|
|
24008
|
+
{
|
|
24009
|
+
"kind": "constant",
|
|
24010
|
+
"name": "eps.MultipartJSONField",
|
|
24011
|
+
"signature": "MultipartJSONField = \"form-data\"",
|
|
24012
|
+
"description": "Name of the single form field carrying the JSON envelope on file-upload endpoints."
|
|
24013
|
+
}
|
|
24014
|
+
],
|
|
24015
|
+
"errorTypes": [
|
|
24016
|
+
{
|
|
24017
|
+
"name": "*eps.HTTPError",
|
|
24018
|
+
"when": "Any non-2xx response. Match it with `errors.As`.",
|
|
24019
|
+
"fields": "`StatusCode`, `URL`, `Body` (decoded envelope or nil), `Raw`"
|
|
24020
|
+
},
|
|
24021
|
+
{
|
|
24022
|
+
"name": "error",
|
|
24023
|
+
"when": "Unknown slug, missing required param, wrong param type, a 2xx body that is not JSON, or a transport failure. Messages are lowercase and `eps:`-prefixed, per Go convention."
|
|
24024
|
+
}
|
|
24025
|
+
],
|
|
24026
|
+
"fileValues": [
|
|
24027
|
+
"A local file path `string`",
|
|
24028
|
+
"An `eps.File{Name, Content}` (or `*eps.File`) for an in-memory upload"
|
|
24029
|
+
],
|
|
24030
|
+
"notes": [
|
|
24031
|
+
"Map keys are sorted before encoding, so query strings and multipart bodies are byte-deterministic.",
|
|
24032
|
+
"The surface is embedded with `go:embed`, so the package needs no network call to resolve a slug."
|
|
24033
|
+
],
|
|
24034
|
+
"example": "package main\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"log\"\n\t\"os\"\n\n\teps \"github.com/ekoindia/eps-sdk-go\"\n)\n\nfunc main() {\n\tclient, err := eps.New(eps.Config{\n\t\tDeveloperKey: os.Getenv(\"EPS_DEVELOPER_KEY\"),\n\t\tAccessKey: os.Getenv(\"EPS_ACCESS_KEY\"),\n\t\tInitiatorID: \"9962981729\",\n\t\tEnvironment: \"sandbox\",\n\t})\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\n\tresult, err := client.Call(context.Background(), \"pan-lite\", map[string]any{\n\t\t\"pan_number\": \"ABCDE1234F\",\n\t\t\"name\": \"Rajesh Kumar\",\n\t\t\"dob\": \"1994-08-29\",\n\t})\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\tfmt.Println(result)\n}"
|
|
24035
|
+
},
|
|
24036
|
+
{
|
|
24037
|
+
"lang": "java",
|
|
24038
|
+
"slug": "java",
|
|
24039
|
+
"title": "Java SDK",
|
|
24040
|
+
"summary": "Backend-only Java client for every EPS API, published from a git tag via JitPack, with HMAC signing built in.",
|
|
24041
|
+
"packageName": "com.github.ekoindia:eps-sdk-java",
|
|
24042
|
+
"installCommand": "com.github.ekoindia:eps-sdk-java",
|
|
24043
|
+
"registry": "JitPack",
|
|
24044
|
+
"registryUrl": "https://jitpack.io/#ekoindia/eps-sdk-java",
|
|
24045
|
+
"minRuntime": "Java 17 or newer",
|
|
24046
|
+
"dependencies": "One: Gson, because Java has no JSON parser in the standard library. HTTP uses the JDK's own `java.net.http`.",
|
|
24047
|
+
"sourceUrl": "https://github.com/ekoindia/eps-platform/tree/main/packages/sdk-java",
|
|
24048
|
+
"docsUrl": "https://eps.eko.in/docs/sdk/java",
|
|
24049
|
+
"installNotes": [
|
|
24050
|
+
"Published through JitPack from a git tag — add the JitPack repository alongside Maven Central.",
|
|
24051
|
+
"Gradle: `maven { url 'https://jitpack.io' }`, then `implementation 'com.github.ekoindia:eps-sdk-java:<tag>'`.",
|
|
24052
|
+
"Maven: a `<repository>` with id `jitpack.io` and url `https://jitpack.io`, then the `com.github.ekoindia:eps-sdk-java` dependency."
|
|
24053
|
+
],
|
|
24054
|
+
"config": [
|
|
24055
|
+
{
|
|
24056
|
+
"name": ".developerKey(…)",
|
|
24057
|
+
"type": "String",
|
|
24058
|
+
"required": true,
|
|
24059
|
+
"description": "Your EPS developer key, sent as the `developer_key` header."
|
|
24060
|
+
},
|
|
24061
|
+
{
|
|
24062
|
+
"name": ".accessKey(…)",
|
|
24063
|
+
"type": "String",
|
|
24064
|
+
"required": true,
|
|
24065
|
+
"description": "Server-side secret used to sign every request. Never ships to a browser."
|
|
24066
|
+
},
|
|
24067
|
+
{
|
|
24068
|
+
"name": ".environment(…)",
|
|
24069
|
+
"type": "\"sandbox\" | \"production\"",
|
|
24070
|
+
"required": true,
|
|
24071
|
+
"description": "Selects the base URL from the embedded surface."
|
|
24072
|
+
},
|
|
24073
|
+
{
|
|
24074
|
+
"name": ".initiatorId(…)",
|
|
24075
|
+
"type": "String",
|
|
24076
|
+
"required": false,
|
|
24077
|
+
"description": "Default `initiator_id` (registered mobile of the API user) injected into every call."
|
|
24078
|
+
},
|
|
24079
|
+
{
|
|
24080
|
+
"name": ".userCode(…)",
|
|
24081
|
+
"type": "String",
|
|
24082
|
+
"required": false,
|
|
24083
|
+
"description": "Default `user_code` (retailer/agent code) injected into every call."
|
|
24084
|
+
},
|
|
24085
|
+
{
|
|
24086
|
+
"name": ".httpClient(…)",
|
|
24087
|
+
"type": "HttpClient",
|
|
24088
|
+
"required": false,
|
|
24089
|
+
"units": "default: 30s connect + 30s per request",
|
|
24090
|
+
"description": "Control timeouts, proxies or redirects by supplying your own client."
|
|
24091
|
+
}
|
|
24092
|
+
],
|
|
24093
|
+
"members": [
|
|
24094
|
+
{
|
|
24095
|
+
"kind": "class",
|
|
24096
|
+
"name": "in.eko.eps.EpsClient",
|
|
24097
|
+
"signature": "EpsClient.builder()…build()",
|
|
24098
|
+
"description": "The client, built through a fluent builder."
|
|
24099
|
+
},
|
|
24100
|
+
{
|
|
24101
|
+
"kind": "method",
|
|
24102
|
+
"name": "call",
|
|
24103
|
+
"signature": "client.call(String slug, Map<String, Object> params): Map<String, Object>",
|
|
24104
|
+
"description": "Validates, signs and sends one endpoint call; returns the decoded envelope."
|
|
24105
|
+
},
|
|
24106
|
+
{
|
|
24107
|
+
"kind": "method",
|
|
24108
|
+
"name": "resolveTarget",
|
|
24109
|
+
"signature": "client.resolveTarget(String slug, Map<String, Object> params): Target",
|
|
24110
|
+
"description": "The signed request for a call, without sending it."
|
|
24111
|
+
},
|
|
24112
|
+
{
|
|
24113
|
+
"kind": "method",
|
|
24114
|
+
"name": "buildHeaders",
|
|
24115
|
+
"signature": "client.buildHeaders(boolean multipart): Map<String, String>",
|
|
24116
|
+
"description": "The four auth headers for a single request."
|
|
24117
|
+
},
|
|
24118
|
+
{
|
|
24119
|
+
"kind": "method",
|
|
24120
|
+
"name": "sign",
|
|
24121
|
+
"signature": "EpsClient.sign(String accessKey, String timestamp): String",
|
|
24122
|
+
"description": "Static. The raw signing primitive, exposed for debugging."
|
|
24123
|
+
},
|
|
24124
|
+
{
|
|
24125
|
+
"kind": "type",
|
|
24126
|
+
"name": "EpsClient.EpsFile",
|
|
24127
|
+
"signature": "record EpsFile(String name, byte[] content)",
|
|
24128
|
+
"description": "An in-memory upload."
|
|
24129
|
+
},
|
|
24130
|
+
{
|
|
24131
|
+
"kind": "constant",
|
|
24132
|
+
"name": "EpsClient.MULTIPART_JSON_FIELD",
|
|
24133
|
+
"signature": "MULTIPART_JSON_FIELD = \"form-data\"",
|
|
24134
|
+
"description": "Name of the single form field carrying the JSON envelope on file-upload endpoints."
|
|
24135
|
+
}
|
|
24136
|
+
],
|
|
24137
|
+
"errorTypes": [
|
|
24138
|
+
{
|
|
24139
|
+
"name": "EpsClient.EpsHttpException",
|
|
24140
|
+
"when": "Any non-2xx response.",
|
|
24141
|
+
"fields": "`status`, `url`, `body` (decoded envelope or null), `raw`"
|
|
24142
|
+
},
|
|
24143
|
+
{
|
|
24144
|
+
"name": "EpsClient.EpsException",
|
|
24145
|
+
"when": "Unknown slug, missing required param, wrong param type, transport failure, or a 2xx body that is not JSON. Unchecked — it extends `RuntimeException`."
|
|
24146
|
+
}
|
|
24147
|
+
],
|
|
24148
|
+
"fileValues": [
|
|
24149
|
+
"A `String` path, a `java.nio.file.Path`, or a `java.io.File`",
|
|
24150
|
+
"An `EpsClient.EpsFile(name, content)` for an in-memory upload"
|
|
24151
|
+
],
|
|
24152
|
+
"notes": [
|
|
24153
|
+
"Upload parts are sent as `application/octet-stream`; the MIME type is not sniffed.",
|
|
24154
|
+
"Gson is configured with `serializeNulls()` — required for wire conformance, since every other SDK keeps explicit nulls."
|
|
24155
|
+
],
|
|
24156
|
+
"example": "import in.eko.eps.EpsClient;\nimport java.util.Map;\n\nEpsClient client = EpsClient.builder()\n .developerKey(System.getenv(\"EPS_DEVELOPER_KEY\"))\n .accessKey(System.getenv(\"EPS_ACCESS_KEY\"))\n .initiatorId(\"9962981729\")\n .environment(\"sandbox\")\n .build();\n\nMap<String, Object> result = client.call(\"pan-lite\", Map.of(\n \"pan_number\", \"ABCDE1234F\",\n \"name\", \"Rajesh Kumar\",\n \"dob\", \"1994-08-29\"\n ));\nSystem.out.println(result);"
|
|
24157
|
+
}
|
|
23559
24158
|
]
|
|
23560
24159
|
}
|
package/dist/index.js
CHANGED
|
@@ -66,6 +66,19 @@ var searchApis = (bundle, query, limit) => {
|
|
|
66
66
|
var getApi = (bundle, slug) => bundle.apis.find((a) => a.slug === slug);
|
|
67
67
|
var getTopic = (bundle, topic) => bundle.topics[topic];
|
|
68
68
|
var getRecipe = (bundle, id) => bundle.recipes.find((r) => r.id === id);
|
|
69
|
+
var listSdks = (bundle) => (bundle.sdks ?? []).map((s) => ({
|
|
70
|
+
lang: s.lang,
|
|
71
|
+
slug: s.slug,
|
|
72
|
+
title: s.title,
|
|
73
|
+
packageName: s.packageName,
|
|
74
|
+
installCommand: s.installCommand,
|
|
75
|
+
registry: s.registry,
|
|
76
|
+
minRuntime: s.minRuntime,
|
|
77
|
+
docsUrl: s.docsUrl
|
|
78
|
+
}));
|
|
79
|
+
var listSdkLanguages = (bundle) => (bundle.sdks ?? []).map((s) => s.lang);
|
|
80
|
+
var listSdkSlugs = (bundle) => (bundle.sdks ?? []).map((s) => s.slug);
|
|
81
|
+
var getSdk = (bundle, language) => (bundle.sdks ?? []).find((s) => s.lang === language || s.slug === language);
|
|
69
82
|
|
|
70
83
|
// src/auth-debug.ts
|
|
71
84
|
var MS_DIGITS = 13;
|
|
@@ -322,6 +335,9 @@ var createEpsServer = (bundle, source, versionState) => {
|
|
|
322
335
|
const categories = listCategories(bundle);
|
|
323
336
|
const categorySchema = categories.length ? z.enum(categories) : z.string();
|
|
324
337
|
const limitSchema = z.number().int().positive().optional();
|
|
338
|
+
const sdkLanguages = listSdkLanguages(bundle);
|
|
339
|
+
const sdkAliases = [.../* @__PURE__ */ new Set([...sdkLanguages, ...listSdkSlugs(bundle)])];
|
|
340
|
+
const sdkLanguageSchema = sdkAliases.length ? z.enum(sdkAliases) : z.string();
|
|
325
341
|
server.registerTool(
|
|
326
342
|
"list_apis",
|
|
327
343
|
{
|
|
@@ -436,6 +452,35 @@ var createEpsServer = (bundle, source, versionState) => {
|
|
|
436
452
|
content: [{ type: "text", text: getSigningSnippet(language) }]
|
|
437
453
|
})
|
|
438
454
|
);
|
|
455
|
+
server.registerTool(
|
|
456
|
+
"list_sdks",
|
|
457
|
+
{
|
|
458
|
+
title: "List EPS SDKs",
|
|
459
|
+
description: "The backend SDKs that wrap every EPS endpoint (language, package, install command, minimum runtime, docs URL). Prefer an SDK over hand-written HTTP: signing, param validation and the error contract are built in. Call get_sdk for the full surface of one.",
|
|
460
|
+
inputSchema: {},
|
|
461
|
+
annotations: READ_ONLY
|
|
462
|
+
},
|
|
463
|
+
async () => json(listSdks(bundle))
|
|
464
|
+
);
|
|
465
|
+
server.registerTool(
|
|
466
|
+
"get_sdk",
|
|
467
|
+
{
|
|
468
|
+
title: "Get an EPS SDK",
|
|
469
|
+
description: "Everything needed to integrate with one EPS SDK: install command and requirements, client config options with their units, every public class/method/type, file-upload values, the error and timeout contract, and a worked call() example. Signing is built in \u2014 NEVER hand-roll the HMAC secret-key when an SDK exists for the language.",
|
|
470
|
+
inputSchema: {
|
|
471
|
+
language: sdkLanguageSchema.describe(
|
|
472
|
+
`One of: ${sdkLanguages.join(", ")} (the guide slug, e.g. "nodejs", also works)`
|
|
473
|
+
)
|
|
474
|
+
},
|
|
475
|
+
annotations: READ_ONLY
|
|
476
|
+
},
|
|
477
|
+
async ({ language }) => {
|
|
478
|
+
const sdk = getSdk(bundle, language);
|
|
479
|
+
return sdk ? json(sdk) : notFound(
|
|
480
|
+
`No EPS SDK for "${language}". Available: ${sdkLanguages.join(", ")}. For other languages call the REST API directly and use get_signing_snippet.`
|
|
481
|
+
);
|
|
482
|
+
}
|
|
483
|
+
);
|
|
439
484
|
server.registerTool(
|
|
440
485
|
"debug_auth",
|
|
441
486
|
{
|