{"id":12397291,"name":"@utcp/http","ecosystem":"npm","description":"HTTP utilities for UTCP","homepage":"https://github.com/universal-tool-calling-protocol/typescript-utcp#readme","licenses":"MPL-2.0","normalized_licenses":["MPL-2.0"],"repository_url":"https://github.com/universal-tool-calling-protocol/typescript-utcp","keywords_array":["utcp","universal-tool-calling-protocol","tools","api","typescript","tool calling","http","agent","ai","llm"],"namespace":"utcp","versions_count":24,"first_release_published_at":"2025-10-18T21:59:06.360Z","latest_release_published_at":"2026-09-09T16:15:56.180Z","latest_release_number":"1.1.13","last_synced_at":"2026-10-02T09:16:14.815Z","created_at":"2025-10-18T21:59:11.939Z","updated_at":"2026-10-02T09:16:14.815Z","registry_url":"https://www.npmjs.com/package/@utcp/http","install_command":"npm install @utcp/http","documentation_url":null,"metadata":{"funding":null,"dist-tags":{"latest":"1.1.13"},"contentPolicy":null},"repo_metadata":{"id":303717960,"uuid":"1016349220","full_name":"universal-tool-calling-protocol/typescript-utcp","owner":"universal-tool-calling-protocol","description":"Official typescript implementation of UTCP. UTCP is an open standard that lets AI agents call any API directly, without extra middleware.","archived":false,"fork":false,"pushed_at":"2026-09-15T19:21:13.000Z","size":1170,"stargazers_count":119,"open_issues_count":1,"forks_count":22,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-09-25T15:50:34.674Z","etag":null,"topics":["mcp","typescript","utcp"],"latest_commit_sha":null,"homepage":"https://www.utcp.io","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mpl-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/universal-tool-calling-protocol.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-07-08T21:57:38.000Z","updated_at":"2026-09-21T10:56:52.000Z","dependencies_parsed_at":"2025-07-09T04:26:20.032Z","dependency_job_id":"830afa07-159c-4762-9058-2df160001758","html_url":"https://github.com/universal-tool-calling-protocol/typescript-utcp","commit_stats":null,"previous_names":["universal-tool-calling-protocol/typescript-utcp"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/universal-tool-calling-protocol/typescript-utcp","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/universal-tool-calling-protocol%2Ftypescript-utcp","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/universal-tool-calling-protocol%2Ftypescript-utcp/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/universal-tool-calling-protocol%2Ftypescript-utcp/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/universal-tool-calling-protocol%2Ftypescript-utcp/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/universal-tool-calling-protocol","download_url":"https://codeload.github.com/universal-tool-calling-protocol/typescript-utcp/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/universal-tool-calling-protocol%2Ftypescript-utcp/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":341189360,"owners_count":37686934,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-08-22T15:14:58.755Z","status":"online","status_checked_at":"2026-09-25T02:00:20.896Z","response_time":55,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"},"owner_record":{"login":"universal-tool-calling-protocol","name":"Universal Tool Calling Protocol","uuid":"217755609","kind":"organization","description":"","email":null,"website":"utcp.io","location":null,"twitter":null,"company":null,"icon_url":"https://avatars.githubusercontent.com/u/217755609?v=4","repositories_count":20,"last_synced_at":"2026-09-24T08:37:24.690Z","metadata":{"has_sponsors_listing":false,"funding":null},"html_url":"https://github.com/universal-tool-calling-protocol","funding_links":[],"total_stars":3044,"followers":894,"following":0,"created_at":"2025-06-25T12:26:36.984Z","updated_at":"2026-09-24T08:37:24.704Z","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/universal-tool-calling-protocol","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/universal-tool-calling-protocol/repositories"},"tags":[{"name":"v1.0","sha":"463b659dde3a50cf69463b39610c5cd496766523","kind":"commit","published_at":"2025-10-27T13:30:36.000Z","download_url":"https://codeload.github.com/universal-tool-calling-protocol/typescript-utcp/tar.gz/v1.0","html_url":"https://github.com/universal-tool-calling-protocol/typescript-utcp/releases/tag/v1.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/universal-tool-calling-protocol/typescript-utcp@v1.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/universal-tool-calling-protocol%2Ftypescript-utcp/tags/v1.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/universal-tool-calling-protocol%2Ftypescript-utcp/tags/v1.0/manifests"}]},"repo_metadata_updated_at":"2026-09-25T19:39:14.538Z","dependent_packages_count":0,"downloads":10679,"downloads_period":"last-month","dependent_repos_count":0,"rankings":{"downloads":null,"dependent_repos_count":23.633881414893587,"dependent_packages_count":34.09299630990901,"stargazers_count":null,"forks_count":null,"docker_downloads_count":null,"average":28.8634388624013},"purl":"pkg:npm/%40utcp/http","advisories":[{"uuid":"GSA_kwCzR0hTQS1yOGo1LTg3NDctODhjbc4ABW5b","url":"https://github.com/advisories/GHSA-r8j5-8747-88cm","title":"@utcp/http: SSRF via attacker-controlled OpenAPI servers[0].url in HTTP communication protocol","description":"## Summary\n\nThe `@utcp/http` package is vulnerable to a blind Server-Side Request Forgery (SSRF) caused by a trust-boundary inconsistency between manual discovery and tool invocation. `registerManual()` validates the discovery URL against an HTTPS / loopback allowlist, but `callTool()` reuses the resolved `toolCallTemplate.url` directly without revalidating, and the `OpenApiConverter` blindly trusts whatever `servers[0].url` an attacker-hosted spec declares. An attacker who hosts a malicious OpenAPI spec on a legitimate HTTPS endpoint can declare e.g. `servers: [{ url: \"http://127.0.0.1:9090\" }]` or `servers: [{ url: \"http://169.254.169.254\" }]`; the converter then produces tools whose URL points at internal services on the agent host.\n\nA separate prefix-bypass also affected the discovery-time check: the previous `startsWith('http://localhost')` guard let URLs like `http://localhost.evil.com` through.\n\n## Sister advisory\n\nThis is the npm/TypeScript counterpart of [GHSA-39j6-4867-gg4w / CVE-2026-44661](https://github.com/universal-tool-calling-protocol/python-utcp/security/advisories/GHSA-39j6-4867-gg4w) on the Python `utcp-http` package. Same vulnerability, same fix shape, same reporter.\n\n## Versions and patch state\n\n- `@utcp/http \u003c= 1.1.1` — vulnerable. Both the loopback-redirect (`http://127.0.0.1`) and the non-loopback internal-IP variants (e.g. `http://169.254.169.254`, `http://10.0.0.5`) succeed. Note: the `streamable_http` and `sse` `callToolStreaming` paths in 1.1.1 are TODO placeholders and don't actually fetch URLs, so the runtime SSRF surface in these protocols is currently confined to discovery — a future implementation must also call `ensureSecureUrl` before issuing the request.\n- `@utcp/http 1.1.2` — full fix. Runtime revalidation in `callTool` closes the non-loopback variants; the `OpenApiConverter` rejects, at conversion time, any spec fetched from a non-loopback source that declares a loopback `servers[0].url`, closing the loopback-redirect variant.\n\n## Impact\n\nA remote attacker who can convince the agent (via the LLM context, prompt injection, or a tool-discovery surface) to register their HTTPS OpenAPI URL can:\n- Map internal networks behind the agent.\n- Read AWS/GCP IAM credentials from cloud metadata endpoints (`http://169.254.169.254`, `http://metadata.google.internal`).\n- Reach unauthenticated internal services exposed on loopback (Elasticsearch, Redis HTTP, internal admin panels, the agent's own HTTP server).\n- Have responses returned to the LLM, which combined with prompt injection enables exfiltration back to the attacker.\n\n## Patch\n\nCommit on `dev`: 21f63e6.\n\nNew helper `packages/http/src/_security.ts` exposes `isSecureUrl`, `isLoopbackUrl`, `ensureSecureUrl`. Hostname-based validation closes the prefix bypass (`http://localhost.evil.com` → rejected). All three protocols' `registerManual` now call `ensureSecureUrl(url, 'manual discovery')`; `callTool` re-checks the resolved URL with `ensureSecureUrl(url, 'tool invocation')` immediately before the axios request. `OpenApiConverter` rejects remote spec → loopback server.\n\n## Workarounds\n\nFor users who cannot upgrade immediately:\n- Refuse to call `registerManual` with any URL controlled by an untrusted party, even over HTTPS.\n- Restrict outbound network access from the host running the agent so internal addresses (RFC1918, 169.254.0.0/16, loopback) are unreachable.\n\n## Credit\n\nDiscovered and reported by [@YLChen-007](https://github.com/YLChen-007) against the Python sibling implementation (universal-tool-calling-protocol/python-utcp#83). The TypeScript port shared the same code shape and the same vulnerability.","origin":"UNSPECIFIED","severity":"MODERATE","published_at":"2026-05-14T20:55:05.000Z","withdrawn_at":null,"classification":"GENERAL","cvss_score":4.7,"cvss_vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:C/C:L/I:L/A:N","references":["https://github.com/universal-tool-calling-protocol/typescript-utcp/security/advisories/GHSA-r8j5-8747-88cm","https://github.com/universal-tool-calling-protocol/python-utcp/issues/83","https://nvd.nist.gov/vuln/detail/CVE-2026-45366","https://github.com/advisories/GHSA-r8j5-8747-88cm"],"source_kind":"github","identifiers":["GHSA-r8j5-8747-88cm","CVE-2026-45366"],"repository_url":null,"blast_radius":0.0,"created_at":"2026-05-14T21:00:17.478Z","updated_at":"2026-09-25T12:03:40.428Z","epss_percentage":0.00196,"epss_percentile":0.08178,"api_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS1yOGo1LTg3NDctODhjbc4ABW5b","html_url":"https://advisories.ecosyste.ms/advisories/GSA_kwCzR0hTQS1yOGo1LTg3NDctODhjbc4ABW5b","packages":[{"ecosystem":"npm","package_name":"@utcp/http","versions":[{"first_patched_version":"1.1.2","vulnerable_version_range":"\u003c= 1.1.1"}],"purl":"pkg:npm/%40utcp%2Fhttp"}],"related_packages_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS1yOGo1LTg3NDctODhjbc4ABW5b/related_packages","related_advisories":[]}],"docker_usage_url":"https://docker.ecosyste.ms/usage/npm/@utcp/http","docker_dependents_count":null,"docker_downloads_count":null,"usage_url":"https://repos.ecosyste.ms/usage/npm/@utcp/http","dependent_repositories_url":"https://repos.ecosyste.ms/api/v1/usage/npm/@utcp/http/dependencies","status":null,"funding_links":[],"critical":null,"issue_metadata":{"last_synced_at":"2026-09-25T10:20:26.392Z","issues_count":4,"pull_requests_count":13,"avg_time_to_close_issue":1632468.3333333333,"avg_time_to_close_pull_request":18820.363636363636,"issues_closed_count":3,"pull_requests_closed_count":11,"pull_request_authors_count":4,"issue_authors_count":2,"avg_comments_per_issue":0.25,"avg_comments_per_pull_request":0.8461538461538461,"merged_pull_requests_count":11,"bot_issues_count":0,"bot_pull_requests_count":0,"past_year_issues_count":2,"past_year_pull_requests_count":11,"past_year_avg_time_to_close_issue":929147.5,"past_year_avg_time_to_close_pull_request":13695.555555555557,"past_year_issues_closed_count":2,"past_year_pull_requests_closed_count":9,"past_year_pull_request_authors_count":3,"past_year_issue_authors_count":1,"past_year_avg_comments_per_issue":0.5,"past_year_avg_comments_per_pull_request":1.0,"past_year_bot_issues_count":0,"past_year_bot_pull_requests_count":0,"past_year_merged_pull_requests_count":9,"issues_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/universal-tool-calling-protocol%2Ftypescript-utcp/issues","maintainers":[{"login":"h3xxit","count":12,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/h3xxit"},{"login":"edujuan","count":1,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/edujuan"}],"active_maintainers":[{"login":"h3xxit","count":11,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/h3xxit"},{"login":"edujuan","count":1,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/edujuan"}]},"versions_url":"https://packages.ecosyste.ms/api/v1/registries/npmjs.org/packages/@utcp%2Fhttp/versions","version_numbers_url":"https://packages.ecosyste.ms/api/v1/registries/npmjs.org/packages/@utcp%2Fhttp/version_numbers","latest_version_url":"https://packages.ecosyste.ms/api/v1/registries/npmjs.org/packages/@utcp%2Fhttp/latest_version","dependent_packages_url":"https://packages.ecosyste.ms/api/v1/registries/npmjs.org/packages/@utcp%2Fhttp/dependent_packages","related_packages_url":"https://packages.ecosyste.ms/api/v1/registries/npmjs.org/packages/@utcp%2Fhttp/related_packages","codemeta_url":"https://packages.ecosyste.ms/api/v1/registries/npmjs.org/packages/@utcp%2Fhttp/codemeta","maintainers":[{"uuid":"razvan.radulescu","login":"razvan.radulescu","name":null,"email":"razviradulescu@gmail.com","url":null,"packages_count":19,"html_url":"https://www.npmjs.com/~razvan.radulescu","role":null,"created_at":"2025-10-19T21:59:08.927Z","updated_at":"2025-10-19T21:59:08.927Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/npmjs.org/maintainers/razvan.radulescu/packages"}]}