kopia lustrzana https://github.com/transitive-bullshit/chatgpt-api
feat: improvements to e2e mcp and http tests
rodzic
28276d1995
commit
1769f761ce
|
@ -15,9 +15,9 @@
|
||||||
"test": "run-s test:*",
|
"test": "run-s test:*",
|
||||||
"test:lint": "eslint .",
|
"test:lint": "eslint .",
|
||||||
"test:typecheck": "tsc --noEmit",
|
"test:typecheck": "tsc --noEmit",
|
||||||
"test-e2e": "vitest run",
|
"e2e": "vitest run",
|
||||||
"test-http-e2e": "vitest run src/http-e2e.test.ts",
|
"e2e-http": "vitest run src/http-e2e.test.ts",
|
||||||
"test-mcp-e2e": "vitest run src/mcp-e2e.test.ts"
|
"e2e-mcp": "vitest run src/mcp-e2e.test.ts"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"ky": "catalog:",
|
"ky": "catalog:",
|
||||||
|
|
|
@ -1,42 +1,6 @@
|
||||||
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
|
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
|
||||||
|
|
||||||
exports[`Basic GET caching > 3.0: GET @dev/test-basic-openapi@010332cf/getPost 1`] = `
|
exports[`HTTP => MCP origin basic "add" tool call success > 5.0: POST @dev/test-basic-mcp/add 1`] = `
|
||||||
{
|
|
||||||
"body": "aut dicta possimus sint mollitia voluptas commodi quo doloremque
|
|
||||||
iste corrupti reiciendis voluptatem eius rerum
|
|
||||||
sit cumque quod eligendi laborum minima
|
|
||||||
perferendis recusandae assumenda consectetur porro architecto ipsum ipsam",
|
|
||||||
"id": 13,
|
|
||||||
"title": "dolorum ut in voluptas mollitia et saepe quo animi",
|
|
||||||
"userId": 2,
|
|
||||||
}
|
|
||||||
`;
|
|
||||||
|
|
||||||
exports[`Basic GET caching > 3.1: GET @dev/test-basic-openapi@010332cf/getPost?postId=13 1`] = `
|
|
||||||
{
|
|
||||||
"body": "aut dicta possimus sint mollitia voluptas commodi quo doloremque
|
|
||||||
iste corrupti reiciendis voluptatem eius rerum
|
|
||||||
sit cumque quod eligendi laborum minima
|
|
||||||
perferendis recusandae assumenda consectetur porro architecto ipsum ipsam",
|
|
||||||
"id": 13,
|
|
||||||
"title": "dolorum ut in voluptas mollitia et saepe quo animi",
|
|
||||||
"userId": 2,
|
|
||||||
}
|
|
||||||
`;
|
|
||||||
|
|
||||||
exports[`Basic GET caching > 3.2: GET @dev/test-basic-openapi@010332cf/get_post?postId=13 1`] = `
|
|
||||||
{
|
|
||||||
"body": "aut dicta possimus sint mollitia voluptas commodi quo doloremque
|
|
||||||
iste corrupti reiciendis voluptatem eius rerum
|
|
||||||
sit cumque quod eligendi laborum minima
|
|
||||||
perferendis recusandae assumenda consectetur porro architecto ipsum ipsam",
|
|
||||||
"id": 13,
|
|
||||||
"title": "dolorum ut in voluptas mollitia et saepe quo animi",
|
|
||||||
"userId": 2,
|
|
||||||
}
|
|
||||||
`;
|
|
||||||
|
|
||||||
exports[`Basic MCP origin "add" tool call success > 5.0: POST @dev/test-basic-mcp/add 1`] = `
|
|
||||||
[
|
[
|
||||||
{
|
{
|
||||||
"text": "42",
|
"text": "42",
|
||||||
|
@ -45,7 +9,7 @@ exports[`Basic MCP origin "add" tool call success > 5.0: POST @dev/test-basic-mc
|
||||||
]
|
]
|
||||||
`;
|
`;
|
||||||
|
|
||||||
exports[`Basic MCP origin "add" tool call success > 5.1: GET @dev/test-basic-mcp/add 1`] = `
|
exports[`HTTP => MCP origin basic "add" tool call success > 5.1: GET @dev/test-basic-mcp/add 1`] = `
|
||||||
[
|
[
|
||||||
{
|
{
|
||||||
"text": "42",
|
"text": "42",
|
||||||
|
@ -54,103 +18,7 @@ exports[`Basic MCP origin "add" tool call success > 5.1: GET @dev/test-basic-mcp
|
||||||
]
|
]
|
||||||
`;
|
`;
|
||||||
|
|
||||||
exports[`Basic OpenAPI getPost errors > 1.8: POST @dev/test-basic-openapi/getPost 1`] = `
|
exports[`HTTP => OpenAPI origin basic GET caching > 3.0: GET @dev/test-basic-openapi@010332cf/getPost 1`] = `
|
||||||
{
|
|
||||||
"body": "quia et suscipit
|
|
||||||
suscipit recusandae consequuntur expedita et cum
|
|
||||||
reprehenderit molestiae ut ut quas totam
|
|
||||||
nostrum rerum est autem sunt rem eveniet architecto",
|
|
||||||
"id": 1,
|
|
||||||
"title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
|
|
||||||
"userId": 1,
|
|
||||||
}
|
|
||||||
`;
|
|
||||||
|
|
||||||
exports[`Basic OpenAPI getPost errors > 1.9: GET @dev/test-basic-openapi/getPost 1`] = `
|
|
||||||
{
|
|
||||||
"body": "quia et suscipit
|
|
||||||
suscipit recusandae consequuntur expedita et cum
|
|
||||||
reprehenderit molestiae ut ut quas totam
|
|
||||||
nostrum rerum est autem sunt rem eveniet architecto",
|
|
||||||
"id": 1,
|
|
||||||
"title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
|
|
||||||
"userId": 1,
|
|
||||||
}
|
|
||||||
`;
|
|
||||||
|
|
||||||
exports[`Basic OpenAPI getPost success > 0.0: POST @dev/test-basic-openapi/getPost 1`] = `
|
|
||||||
{
|
|
||||||
"body": "quia et suscipit
|
|
||||||
suscipit recusandae consequuntur expedita et cum
|
|
||||||
reprehenderit molestiae ut ut quas totam
|
|
||||||
nostrum rerum est autem sunt rem eveniet architecto",
|
|
||||||
"id": 1,
|
|
||||||
"title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
|
|
||||||
"userId": 1,
|
|
||||||
}
|
|
||||||
`;
|
|
||||||
|
|
||||||
exports[`Basic OpenAPI getPost success > 0.1: POST @dev/test-basic-openapi@latest/getPost 1`] = `
|
|
||||||
{
|
|
||||||
"body": "quia et suscipit
|
|
||||||
suscipit recusandae consequuntur expedita et cum
|
|
||||||
reprehenderit molestiae ut ut quas totam
|
|
||||||
nostrum rerum est autem sunt rem eveniet architecto",
|
|
||||||
"id": 1,
|
|
||||||
"title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
|
|
||||||
"userId": 1,
|
|
||||||
}
|
|
||||||
`;
|
|
||||||
|
|
||||||
exports[`Basic OpenAPI getPost success > 0.2: GET @dev/test-basic-openapi/getPost 1`] = `
|
|
||||||
{
|
|
||||||
"body": "quia et suscipit
|
|
||||||
suscipit recusandae consequuntur expedita et cum
|
|
||||||
reprehenderit molestiae ut ut quas totam
|
|
||||||
nostrum rerum est autem sunt rem eveniet architecto",
|
|
||||||
"id": 1,
|
|
||||||
"title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
|
|
||||||
"userId": 1,
|
|
||||||
}
|
|
||||||
`;
|
|
||||||
|
|
||||||
exports[`Basic OpenAPI getPost success > 0.3: GET @dev/test-basic-openapi@010332cf/getPost?postId=1 1`] = `
|
|
||||||
{
|
|
||||||
"body": "quia et suscipit
|
|
||||||
suscipit recusandae consequuntur expedita et cum
|
|
||||||
reprehenderit molestiae ut ut quas totam
|
|
||||||
nostrum rerum est autem sunt rem eveniet architecto",
|
|
||||||
"id": 1,
|
|
||||||
"title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
|
|
||||||
"userId": 1,
|
|
||||||
}
|
|
||||||
`;
|
|
||||||
|
|
||||||
exports[`Basic OpenAPI getPost success > 0.4: GET @dev/test-basic-openapi@010332cf/get_post?postId=1 1`] = `
|
|
||||||
{
|
|
||||||
"body": "quia et suscipit
|
|
||||||
suscipit recusandae consequuntur expedita et cum
|
|
||||||
reprehenderit molestiae ut ut quas totam
|
|
||||||
nostrum rerum est autem sunt rem eveniet architecto",
|
|
||||||
"id": 1,
|
|
||||||
"title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
|
|
||||||
"userId": 1,
|
|
||||||
}
|
|
||||||
`;
|
|
||||||
|
|
||||||
exports[`Basic OpenAPI getPost success > 0.5: GET @dev/test-basic-openapi@010332cf/getPost 1`] = `
|
|
||||||
{
|
|
||||||
"body": "quia et suscipit
|
|
||||||
suscipit recusandae consequuntur expedita et cum
|
|
||||||
reprehenderit molestiae ut ut quas totam
|
|
||||||
nostrum rerum est autem sunt rem eveniet architecto",
|
|
||||||
"id": 1,
|
|
||||||
"title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
|
|
||||||
"userId": 1,
|
|
||||||
}
|
|
||||||
`;
|
|
||||||
|
|
||||||
exports[`Basic POST caching > 4.0: POST @dev/test-basic-openapi@010332cf/get_post 1`] = `
|
|
||||||
{
|
{
|
||||||
"body": "aut dicta possimus sint mollitia voluptas commodi quo doloremque
|
"body": "aut dicta possimus sint mollitia voluptas commodi quo doloremque
|
||||||
iste corrupti reiciendis voluptatem eius rerum
|
iste corrupti reiciendis voluptatem eius rerum
|
||||||
|
@ -162,7 +30,7 @@ perferendis recusandae assumenda consectetur porro architecto ipsum ipsam",
|
||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
|
|
||||||
exports[`Basic POST caching > 4.1: POST @dev/test-basic-openapi@010332cf/get_post 1`] = `
|
exports[`HTTP => OpenAPI origin basic GET caching > 3.1: GET @dev/test-basic-openapi@010332cf/getPost?postId=13 1`] = `
|
||||||
{
|
{
|
||||||
"body": "aut dicta possimus sint mollitia voluptas commodi quo doloremque
|
"body": "aut dicta possimus sint mollitia voluptas commodi quo doloremque
|
||||||
iste corrupti reiciendis voluptatem eius rerum
|
iste corrupti reiciendis voluptatem eius rerum
|
||||||
|
@ -174,7 +42,43 @@ perferendis recusandae assumenda consectetur porro architecto ipsum ipsam",
|
||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
|
|
||||||
exports[`Bypass caching > 2.0: GET @dev/test-basic-openapi@fc856666/getPost 1`] = `
|
exports[`HTTP => OpenAPI origin basic GET caching > 3.2: GET @dev/test-basic-openapi@010332cf/get_post?postId=13 1`] = `
|
||||||
|
{
|
||||||
|
"body": "aut dicta possimus sint mollitia voluptas commodi quo doloremque
|
||||||
|
iste corrupti reiciendis voluptatem eius rerum
|
||||||
|
sit cumque quod eligendi laborum minima
|
||||||
|
perferendis recusandae assumenda consectetur porro architecto ipsum ipsam",
|
||||||
|
"id": 13,
|
||||||
|
"title": "dolorum ut in voluptas mollitia et saepe quo animi",
|
||||||
|
"userId": 2,
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`HTTP => OpenAPI origin basic POST caching > 4.0: POST @dev/test-basic-openapi@010332cf/get_post 1`] = `
|
||||||
|
{
|
||||||
|
"body": "aut dicta possimus sint mollitia voluptas commodi quo doloremque
|
||||||
|
iste corrupti reiciendis voluptatem eius rerum
|
||||||
|
sit cumque quod eligendi laborum minima
|
||||||
|
perferendis recusandae assumenda consectetur porro architecto ipsum ipsam",
|
||||||
|
"id": 13,
|
||||||
|
"title": "dolorum ut in voluptas mollitia et saepe quo animi",
|
||||||
|
"userId": 2,
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`HTTP => OpenAPI origin basic POST caching > 4.1: POST @dev/test-basic-openapi@010332cf/get_post 1`] = `
|
||||||
|
{
|
||||||
|
"body": "aut dicta possimus sint mollitia voluptas commodi quo doloremque
|
||||||
|
iste corrupti reiciendis voluptatem eius rerum
|
||||||
|
sit cumque quod eligendi laborum minima
|
||||||
|
perferendis recusandae assumenda consectetur porro architecto ipsum ipsam",
|
||||||
|
"id": 13,
|
||||||
|
"title": "dolorum ut in voluptas mollitia et saepe quo animi",
|
||||||
|
"userId": 2,
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`HTTP => OpenAPI origin basic bypass caching > 2.0: GET @dev/test-basic-openapi@fc856666/getPost 1`] = `
|
||||||
{
|
{
|
||||||
"body": "consectetur animi nesciunt iure dolore
|
"body": "consectetur animi nesciunt iure dolore
|
||||||
enim quia ad
|
enim quia ad
|
||||||
|
@ -186,7 +90,7 @@ et est aut quod aut provident voluptas autem voluptas",
|
||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
|
|
||||||
exports[`Bypass caching > 2.1: GET @dev/test-basic-openapi@010332cf/getPost 1`] = `
|
exports[`HTTP => OpenAPI origin basic bypass caching > 2.1: GET @dev/test-basic-openapi@010332cf/getPost 1`] = `
|
||||||
{
|
{
|
||||||
"body": "consectetur animi nesciunt iure dolore
|
"body": "consectetur animi nesciunt iure dolore
|
||||||
enim quia ad
|
enim quia ad
|
||||||
|
@ -198,7 +102,7 @@ et est aut quod aut provident voluptas autem voluptas",
|
||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
|
|
||||||
exports[`Bypass caching > 2.2: GET @dev/test-basic-openapi@010332cf/getPost?postId=9 1`] = `
|
exports[`HTTP => OpenAPI origin basic bypass caching > 2.2: GET @dev/test-basic-openapi@010332cf/getPost?postId=9 1`] = `
|
||||||
{
|
{
|
||||||
"body": "consectetur animi nesciunt iure dolore
|
"body": "consectetur animi nesciunt iure dolore
|
||||||
enim quia ad
|
enim quia ad
|
||||||
|
@ -210,7 +114,7 @@ et est aut quod aut provident voluptas autem voluptas",
|
||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
|
|
||||||
exports[`Bypass caching > 2.3: GET @dev/test-basic-openapi@010332cf/get_post?postId=9 1`] = `
|
exports[`HTTP => OpenAPI origin basic bypass caching > 2.3: GET @dev/test-basic-openapi@010332cf/get_post?postId=9 1`] = `
|
||||||
{
|
{
|
||||||
"body": "consectetur animi nesciunt iure dolore
|
"body": "consectetur animi nesciunt iure dolore
|
||||||
enim quia ad
|
enim quia ad
|
||||||
|
@ -222,7 +126,7 @@ et est aut quod aut provident voluptas autem voluptas",
|
||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
|
|
||||||
exports[`Bypass caching > 2.4: GET @dev/test-basic-openapi@010332cf/get_post?postId=9 1`] = `
|
exports[`HTTP => OpenAPI origin basic bypass caching > 2.4: GET @dev/test-basic-openapi@010332cf/get_post?postId=9 1`] = `
|
||||||
{
|
{
|
||||||
"body": "consectetur animi nesciunt iure dolore
|
"body": "consectetur animi nesciunt iure dolore
|
||||||
enim quia ad
|
enim quia ad
|
||||||
|
@ -234,7 +138,7 @@ et est aut quod aut provident voluptas autem voluptas",
|
||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
|
|
||||||
exports[`Bypass caching > 2.5: GET @dev/test-basic-openapi@010332cf/get_post?postId=9 1`] = `
|
exports[`HTTP => OpenAPI origin basic bypass caching > 2.5: GET @dev/test-basic-openapi@010332cf/get_post?postId=9 1`] = `
|
||||||
{
|
{
|
||||||
"body": "consectetur animi nesciunt iure dolore
|
"body": "consectetur animi nesciunt iure dolore
|
||||||
enim quia ad
|
enim quia ad
|
||||||
|
@ -246,18 +150,114 @@ et est aut quod aut provident voluptas autem voluptas",
|
||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
|
|
||||||
exports[`OpenAPI kitchen echo tool with empty body > 9.0: POST @dev/test-everything-openapi/echo 1`] = `{}`;
|
exports[`HTTP => OpenAPI origin basic getPost errors > 1.8: POST @dev/test-basic-openapi/getPost 1`] = `
|
||||||
|
{
|
||||||
|
"body": "quia et suscipit
|
||||||
|
suscipit recusandae consequuntur expedita et cum
|
||||||
|
reprehenderit molestiae ut ut quas totam
|
||||||
|
nostrum rerum est autem sunt rem eveniet architecto",
|
||||||
|
"id": 1,
|
||||||
|
"title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
|
||||||
|
"userId": 1,
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
|
||||||
exports[`OpenAPI kitchen echo tool with empty body > 9.1: POST @dev/test-everything-openapi/echo 1`] = `{}`;
|
exports[`HTTP => OpenAPI origin basic getPost errors > 1.9: GET @dev/test-basic-openapi/getPost 1`] = `
|
||||||
|
{
|
||||||
|
"body": "quia et suscipit
|
||||||
|
suscipit recusandae consequuntur expedita et cum
|
||||||
|
reprehenderit molestiae ut ut quas totam
|
||||||
|
nostrum rerum est autem sunt rem eveniet architecto",
|
||||||
|
"id": 1,
|
||||||
|
"title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
|
||||||
|
"userId": 1,
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
|
||||||
exports[`OpenAPI kitchen sink pure tool > 7.0: POST @dev/test-everything-openapi/pure 1`] = `
|
exports[`HTTP => OpenAPI origin basic getPost success > 0.0: POST @dev/test-basic-openapi/getPost 1`] = `
|
||||||
|
{
|
||||||
|
"body": "quia et suscipit
|
||||||
|
suscipit recusandae consequuntur expedita et cum
|
||||||
|
reprehenderit molestiae ut ut quas totam
|
||||||
|
nostrum rerum est autem sunt rem eveniet architecto",
|
||||||
|
"id": 1,
|
||||||
|
"title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
|
||||||
|
"userId": 1,
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`HTTP => OpenAPI origin basic getPost success > 0.1: POST @dev/test-basic-openapi@latest/getPost 1`] = `
|
||||||
|
{
|
||||||
|
"body": "quia et suscipit
|
||||||
|
suscipit recusandae consequuntur expedita et cum
|
||||||
|
reprehenderit molestiae ut ut quas totam
|
||||||
|
nostrum rerum est autem sunt rem eveniet architecto",
|
||||||
|
"id": 1,
|
||||||
|
"title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
|
||||||
|
"userId": 1,
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`HTTP => OpenAPI origin basic getPost success > 0.2: GET @dev/test-basic-openapi/getPost 1`] = `
|
||||||
|
{
|
||||||
|
"body": "quia et suscipit
|
||||||
|
suscipit recusandae consequuntur expedita et cum
|
||||||
|
reprehenderit molestiae ut ut quas totam
|
||||||
|
nostrum rerum est autem sunt rem eveniet architecto",
|
||||||
|
"id": 1,
|
||||||
|
"title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
|
||||||
|
"userId": 1,
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`HTTP => OpenAPI origin basic getPost success > 0.3: GET @dev/test-basic-openapi@010332cf/getPost?postId=1 1`] = `
|
||||||
|
{
|
||||||
|
"body": "quia et suscipit
|
||||||
|
suscipit recusandae consequuntur expedita et cum
|
||||||
|
reprehenderit molestiae ut ut quas totam
|
||||||
|
nostrum rerum est autem sunt rem eveniet architecto",
|
||||||
|
"id": 1,
|
||||||
|
"title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
|
||||||
|
"userId": 1,
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`HTTP => OpenAPI origin basic getPost success > 0.4: GET @dev/test-basic-openapi@010332cf/get_post?postId=1 1`] = `
|
||||||
|
{
|
||||||
|
"body": "quia et suscipit
|
||||||
|
suscipit recusandae consequuntur expedita et cum
|
||||||
|
reprehenderit molestiae ut ut quas totam
|
||||||
|
nostrum rerum est autem sunt rem eveniet architecto",
|
||||||
|
"id": 1,
|
||||||
|
"title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
|
||||||
|
"userId": 1,
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`HTTP => OpenAPI origin basic getPost success > 0.5: GET @dev/test-basic-openapi@010332cf/getPost 1`] = `
|
||||||
|
{
|
||||||
|
"body": "quia et suscipit
|
||||||
|
suscipit recusandae consequuntur expedita et cum
|
||||||
|
reprehenderit molestiae ut ut quas totam
|
||||||
|
nostrum rerum est autem sunt rem eveniet architecto",
|
||||||
|
"id": 1,
|
||||||
|
"title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
|
||||||
|
"userId": 1,
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`HTTP => OpenAPI origin everything "echo" tool with empty body > 9.0: POST @dev/test-everything-openapi/echo 1`] = `{}`;
|
||||||
|
|
||||||
|
exports[`HTTP => OpenAPI origin everything "echo" tool with empty body > 9.1: POST @dev/test-everything-openapi/echo 1`] = `{}`;
|
||||||
|
|
||||||
|
exports[`HTTP => OpenAPI origin everything "pure" tool > 7.0: POST @dev/test-everything-openapi/pure 1`] = `
|
||||||
{
|
{
|
||||||
"foo": "bar",
|
"foo": "bar",
|
||||||
"nala": "kitten",
|
"nala": "kitten",
|
||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
|
|
||||||
exports[`OpenAPI kitchen sink pure tool > 7.1: POST @dev/test-everything-openapi/pure 1`] = `
|
exports[`HTTP => OpenAPI origin everything "pure" tool > 7.1: POST @dev/test-everything-openapi/pure 1`] = `
|
||||||
{
|
{
|
||||||
"foo": "bar",
|
"foo": "bar",
|
||||||
"nala": "kitten",
|
"nala": "kitten",
|
||||||
|
|
|
@ -1,6 +1,17 @@
|
||||||
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
|
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
|
||||||
|
|
||||||
exports[`Basic MCP => OpenAPI @ 010332cf get_post success > 2.0: @dev/test-basic-openapi@010332cf/mcp get_post 1`] = `
|
exports[`MCP => MCP origin basic "add" tool call success > 9.0: @dev/test-basic-mcp/mcp add 1`] = `
|
||||||
|
{
|
||||||
|
"content": [
|
||||||
|
{
|
||||||
|
"text": "62",
|
||||||
|
"type": "text",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`MCP => OpenAPI origin basic @ 010332cf get_post success > 2.0: @dev/test-basic-openapi@010332cf/mcp get_post 1`] = `
|
||||||
{
|
{
|
||||||
"content": [],
|
"content": [],
|
||||||
"isError": false,
|
"isError": false,
|
||||||
|
@ -16,7 +27,7 @@ ipsam ut commodi dolor voluptatum modi aut vitae",
|
||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
|
|
||||||
exports[`Basic MCP => OpenAPI @ latest get_post success > 1.0: @dev/test-basic-openapi@latest/mcp get_post 1`] = `
|
exports[`MCP => OpenAPI origin basic @ latest get_post success > 1.0: @dev/test-basic-openapi@latest/mcp get_post 1`] = `
|
||||||
{
|
{
|
||||||
"content": [],
|
"content": [],
|
||||||
"isError": false,
|
"isError": false,
|
||||||
|
@ -32,17 +43,71 @@ molestiae porro eius odio et labore et velit aut",
|
||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
|
|
||||||
exports[`Basic MCP => OpenAPI everything errors > 5.0: @dev/test-everything-openapi/mcp strict_additional_properties 1`] = `
|
exports[`MCP => OpenAPI origin basic bypass caching > 6.0: @dev/test-basic-openapi@fc856666/mcp get_post 1`] = `
|
||||||
{
|
{
|
||||||
"content": [],
|
"content": [],
|
||||||
"isError": false,
|
"isError": false,
|
||||||
"structuredContent": {
|
"structuredContent": {
|
||||||
"foo": "bar",
|
"body": "quia et suscipit
|
||||||
|
suscipit recusandae consequuntur expedita et cum
|
||||||
|
reprehenderit molestiae ut ut quas totam
|
||||||
|
nostrum rerum est autem sunt rem eveniet architecto",
|
||||||
|
"id": 1,
|
||||||
|
"title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
|
||||||
|
"userId": 1,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
|
|
||||||
exports[`Basic MCP => OpenAPI get_post errors > 4.3: @dev/test-basic-openapi/mcp get_post 1`] = `
|
exports[`MCP => OpenAPI origin basic caching > 7.0: @dev/test-basic-openapi@010332cf/mcp get_post 1`] = `
|
||||||
|
{
|
||||||
|
"content": [],
|
||||||
|
"isError": false,
|
||||||
|
"structuredContent": {
|
||||||
|
"body": "quia et suscipit
|
||||||
|
suscipit recusandae consequuntur expedita et cum
|
||||||
|
reprehenderit molestiae ut ut quas totam
|
||||||
|
nostrum rerum est autem sunt rem eveniet architecto",
|
||||||
|
"id": 1,
|
||||||
|
"title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
|
||||||
|
"userId": 1,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`MCP => OpenAPI origin basic caching > 7.1: @dev/test-basic-openapi@010332cf/mcp get_post 1`] = `
|
||||||
|
{
|
||||||
|
"content": [],
|
||||||
|
"isError": false,
|
||||||
|
"structuredContent": {
|
||||||
|
"body": "quia et suscipit
|
||||||
|
suscipit recusandae consequuntur expedita et cum
|
||||||
|
reprehenderit molestiae ut ut quas totam
|
||||||
|
nostrum rerum est autem sunt rem eveniet architecto",
|
||||||
|
"id": 1,
|
||||||
|
"title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
|
||||||
|
"userId": 1,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`MCP => OpenAPI origin basic caching > 7.2: @dev/test-basic-openapi@010332cf/mcp get_post 1`] = `
|
||||||
|
{
|
||||||
|
"content": [],
|
||||||
|
"isError": false,
|
||||||
|
"structuredContent": {
|
||||||
|
"body": "quia et suscipit
|
||||||
|
suscipit recusandae consequuntur expedita et cum
|
||||||
|
reprehenderit molestiae ut ut quas totam
|
||||||
|
nostrum rerum est autem sunt rem eveniet architecto",
|
||||||
|
"id": 1,
|
||||||
|
"title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
|
||||||
|
"userId": 1,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`MCP => OpenAPI origin basic get_post errors > 4.3: @dev/test-basic-openapi/mcp get_post 1`] = `
|
||||||
{
|
{
|
||||||
"content": [],
|
"content": [],
|
||||||
"isError": false,
|
"isError": false,
|
||||||
|
@ -58,7 +123,7 @@ sunt ut sequi eos ea sed quas",
|
||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
|
|
||||||
exports[`Basic MCP => OpenAPI get_post success > 0.0: @dev/test-basic-openapi/mcp get_post 1`] = `
|
exports[`MCP => OpenAPI origin basic get_post success > 0.0: @dev/test-basic-openapi/mcp get_post 1`] = `
|
||||||
{
|
{
|
||||||
"content": [],
|
"content": [],
|
||||||
"isError": false,
|
"isError": false,
|
||||||
|
@ -73,3 +138,45 @@ nostrum rerum est autem sunt rem eveniet architecto",
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
|
|
||||||
|
exports[`MCP => OpenAPI origin basic normalized caching > 8.0: @dev/test-basic-openapi@010332cf/mcp get_post 1`] = `
|
||||||
|
{
|
||||||
|
"content": [],
|
||||||
|
"isError": false,
|
||||||
|
"structuredContent": {
|
||||||
|
"body": "quia et suscipit
|
||||||
|
suscipit recusandae consequuntur expedita et cum
|
||||||
|
reprehenderit molestiae ut ut quas totam
|
||||||
|
nostrum rerum est autem sunt rem eveniet architecto",
|
||||||
|
"id": 1,
|
||||||
|
"title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
|
||||||
|
"userId": 1,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`MCP => OpenAPI origin basic normalized caching > 8.1: @dev/test-basic-openapi@010332cf/mcp get_post 1`] = `
|
||||||
|
{
|
||||||
|
"content": [],
|
||||||
|
"isError": false,
|
||||||
|
"structuredContent": {
|
||||||
|
"body": "quia et suscipit
|
||||||
|
suscipit recusandae consequuntur expedita et cum
|
||||||
|
reprehenderit molestiae ut ut quas totam
|
||||||
|
nostrum rerum est autem sunt rem eveniet architecto",
|
||||||
|
"id": 1,
|
||||||
|
"title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
|
||||||
|
"userId": 1,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`MCP => OpenAPI origin everything errors > 5.0: @dev/test-everything-openapi/mcp strict_additional_properties 1`] = `
|
||||||
|
{
|
||||||
|
"content": [],
|
||||||
|
"isError": false,
|
||||||
|
"structuredContent": {
|
||||||
|
"foo": "bar",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
|
|
@ -58,7 +58,7 @@ const now = Date.now()
|
||||||
|
|
||||||
export const fixtureSuites: E2ETestFixtureSuite[] = [
|
export const fixtureSuites: E2ETestFixtureSuite[] = [
|
||||||
{
|
{
|
||||||
title: 'Basic OpenAPI getPost success',
|
title: 'HTTP => OpenAPI origin basic getPost success',
|
||||||
compareResponseBodies: true,
|
compareResponseBodies: true,
|
||||||
fixtures: [
|
fixtures: [
|
||||||
{
|
{
|
||||||
|
@ -107,7 +107,7 @@ export const fixtureSuites: E2ETestFixtureSuite[] = [
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: 'Basic OpenAPI getPost errors',
|
title: 'HTTP => OpenAPI origin basic getPost errors',
|
||||||
fixtures: [
|
fixtures: [
|
||||||
{
|
{
|
||||||
path: '@dev/test-basic-openapi/getPost',
|
path: '@dev/test-basic-openapi/getPost',
|
||||||
|
@ -248,7 +248,7 @@ export const fixtureSuites: E2ETestFixtureSuite[] = [
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: 'Bypass caching',
|
title: 'HTTP => OpenAPI origin basic bypass caching',
|
||||||
compareResponseBodies: true,
|
compareResponseBodies: true,
|
||||||
fixtures: [
|
fixtures: [
|
||||||
{
|
{
|
||||||
|
@ -340,7 +340,7 @@ export const fixtureSuites: E2ETestFixtureSuite[] = [
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: 'Basic GET caching',
|
title: 'HTTP => OpenAPI origin basic GET caching',
|
||||||
compareResponseBodies: true,
|
compareResponseBodies: true,
|
||||||
sequential: true,
|
sequential: true,
|
||||||
fixtures: [
|
fixtures: [
|
||||||
|
@ -390,7 +390,7 @@ export const fixtureSuites: E2ETestFixtureSuite[] = [
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: 'Basic POST caching',
|
title: 'HTTP => OpenAPI origin basic POST caching',
|
||||||
compareResponseBodies: true,
|
compareResponseBodies: true,
|
||||||
sequential: true,
|
sequential: true,
|
||||||
fixtures: [
|
fixtures: [
|
||||||
|
@ -422,7 +422,7 @@ export const fixtureSuites: E2ETestFixtureSuite[] = [
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: 'Basic MCP origin "add" tool call success',
|
title: 'HTTP => MCP origin basic "add" tool call success',
|
||||||
compareResponseBodies: true,
|
compareResponseBodies: true,
|
||||||
fixtures: [
|
fixtures: [
|
||||||
{
|
{
|
||||||
|
@ -453,7 +453,7 @@ export const fixtureSuites: E2ETestFixtureSuite[] = [
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: 'Basic MCP origin "echo" tool call success',
|
title: 'HTTP => MCP origin basic "echo" tool call success',
|
||||||
snapshot: false,
|
snapshot: false,
|
||||||
fixtures: [
|
fixtures: [
|
||||||
{
|
{
|
||||||
|
@ -500,7 +500,7 @@ export const fixtureSuites: E2ETestFixtureSuite[] = [
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: 'OpenAPI kitchen sink pure tool',
|
title: 'HTTP => OpenAPI origin everything "pure" tool',
|
||||||
sequential: true,
|
sequential: true,
|
||||||
compareResponseBodies: true,
|
compareResponseBodies: true,
|
||||||
fixtures: [
|
fixtures: [
|
||||||
|
@ -549,7 +549,7 @@ export const fixtureSuites: E2ETestFixtureSuite[] = [
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: 'OpenAPI kitchen sink disabled tool',
|
title: 'HTTP => OpenAPI origin everything "disabled_tool"',
|
||||||
fixtures: [
|
fixtures: [
|
||||||
{
|
{
|
||||||
path: '@dev/test-everything-openapi/disabled_tool',
|
path: '@dev/test-everything-openapi/disabled_tool',
|
||||||
|
@ -563,7 +563,7 @@ export const fixtureSuites: E2ETestFixtureSuite[] = [
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: 'OpenAPI kitchen echo tool with empty body',
|
title: 'HTTP => OpenAPI origin everything "echo" tool with empty body',
|
||||||
compareResponseBodies: true,
|
compareResponseBodies: true,
|
||||||
fixtures: [
|
fixtures: [
|
||||||
{
|
{
|
||||||
|
@ -588,7 +588,7 @@ export const fixtureSuites: E2ETestFixtureSuite[] = [
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: 'OpenAPI kitchen sink unpure_marked_pure tool',
|
title: 'HTTP => OpenAPI origin everything "unpure_marked_pure" tool',
|
||||||
compareResponseBodies: true,
|
compareResponseBodies: true,
|
||||||
snapshot: false,
|
snapshot: false,
|
||||||
fixtures: [
|
fixtures: [
|
||||||
|
|
|
@ -82,7 +82,8 @@ for (const [i, fixtureSuite] of fixtureSuites.entries()) {
|
||||||
async () => {
|
async () => {
|
||||||
const result = await client.callTool({
|
const result = await client.callTool({
|
||||||
name: toolName,
|
name: toolName,
|
||||||
arguments: fixture.request.args
|
arguments: fixture.request.args,
|
||||||
|
_meta: fixture.request._meta
|
||||||
})
|
})
|
||||||
|
|
||||||
if (debugFixture) {
|
if (debugFixture) {
|
||||||
|
|
|
@ -11,6 +11,7 @@ export type MCPE2ETestFixture = {
|
||||||
request: {
|
request: {
|
||||||
name: string
|
name: string
|
||||||
args: Record<string, unknown>
|
args: Record<string, unknown>
|
||||||
|
_meta?: Record<string, unknown>
|
||||||
}
|
}
|
||||||
|
|
||||||
response?: {
|
response?: {
|
||||||
|
@ -63,7 +64,7 @@ const now = Date.now()
|
||||||
|
|
||||||
export const fixtureSuites: MCPE2ETestFixtureSuite[] = [
|
export const fixtureSuites: MCPE2ETestFixtureSuite[] = [
|
||||||
{
|
{
|
||||||
title: 'Basic MCP => OpenAPI get_post success',
|
title: 'MCP => OpenAPI origin basic get_post success',
|
||||||
path: '@dev/test-basic-openapi/mcp',
|
path: '@dev/test-basic-openapi/mcp',
|
||||||
fixtures: [
|
fixtures: [
|
||||||
{
|
{
|
||||||
|
@ -77,7 +78,7 @@ export const fixtureSuites: MCPE2ETestFixtureSuite[] = [
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: 'Basic MCP => OpenAPI @ latest get_post success ',
|
title: 'MCP => OpenAPI origin basic @ latest get_post success ',
|
||||||
path: '@dev/test-basic-openapi@latest/mcp',
|
path: '@dev/test-basic-openapi@latest/mcp',
|
||||||
fixtures: [
|
fixtures: [
|
||||||
{
|
{
|
||||||
|
@ -91,7 +92,7 @@ export const fixtureSuites: MCPE2ETestFixtureSuite[] = [
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: 'Basic MCP => OpenAPI @ 010332cf get_post success ',
|
title: 'MCP => OpenAPI origin basic @ 010332cf get_post success ',
|
||||||
path: '@dev/test-basic-openapi@010332cf/mcp',
|
path: '@dev/test-basic-openapi@010332cf/mcp',
|
||||||
fixtures: [
|
fixtures: [
|
||||||
{
|
{
|
||||||
|
@ -105,7 +106,7 @@ export const fixtureSuites: MCPE2ETestFixtureSuite[] = [
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: 'Basic MCP => MCP "echo" tool call success',
|
title: 'MCP => MCP origin basic "echo" tool call success',
|
||||||
path: '@dev/test-basic-mcp/mcp',
|
path: '@dev/test-basic-mcp/mcp',
|
||||||
stableSnapshot: false,
|
stableSnapshot: false,
|
||||||
fixtures: [
|
fixtures: [
|
||||||
|
@ -152,7 +153,7 @@ export const fixtureSuites: MCPE2ETestFixtureSuite[] = [
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: 'Basic MCP => OpenAPI get_post errors',
|
title: 'MCP => OpenAPI origin basic get_post errors',
|
||||||
path: '@dev/test-basic-openapi/mcp',
|
path: '@dev/test-basic-openapi/mcp',
|
||||||
fixtures: [
|
fixtures: [
|
||||||
{
|
{
|
||||||
|
@ -219,7 +220,7 @@ export const fixtureSuites: MCPE2ETestFixtureSuite[] = [
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: 'Basic MCP => OpenAPI everything errors',
|
title: 'MCP => OpenAPI origin everything errors',
|
||||||
path: '@dev/test-everything-openapi/mcp',
|
path: '@dev/test-everything-openapi/mcp',
|
||||||
fixtures: [
|
fixtures: [
|
||||||
{
|
{
|
||||||
|
@ -251,5 +252,137 @@ export const fixtureSuites: MCPE2ETestFixtureSuite[] = [
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: 'MCP => OpenAPI origin basic bypass caching',
|
||||||
|
path: '@dev/test-basic-openapi@fc856666/mcp',
|
||||||
|
fixtures: [
|
||||||
|
{
|
||||||
|
// ensure we bypass the cache for requests for tools which do not have
|
||||||
|
// a custom `pure` or `cacheControl` set in their tool config.
|
||||||
|
request: {
|
||||||
|
name: 'get_post',
|
||||||
|
args: {
|
||||||
|
postId: 1
|
||||||
|
}
|
||||||
|
},
|
||||||
|
response: {
|
||||||
|
isError: false,
|
||||||
|
_agenticMeta: {
|
||||||
|
cacheStatus: 'BYPASS'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: 'MCP => OpenAPI origin basic caching',
|
||||||
|
path: '@dev/test-basic-openapi@010332cf/mcp',
|
||||||
|
fixtures: [
|
||||||
|
{
|
||||||
|
request: {
|
||||||
|
name: 'get_post',
|
||||||
|
args: {
|
||||||
|
postId: 1
|
||||||
|
}
|
||||||
|
},
|
||||||
|
response: {
|
||||||
|
isError: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
request: {
|
||||||
|
name: 'get_post',
|
||||||
|
args: {
|
||||||
|
postId: 1
|
||||||
|
}
|
||||||
|
},
|
||||||
|
response: {
|
||||||
|
isError: false,
|
||||||
|
_agenticMeta: {
|
||||||
|
// second request should hit the cache
|
||||||
|
cacheStatus: 'HIT'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
request: {
|
||||||
|
name: 'get_post',
|
||||||
|
args: {
|
||||||
|
postId: 1
|
||||||
|
},
|
||||||
|
// disable caching via a custom metadata cache-control header
|
||||||
|
_meta: {
|
||||||
|
agentic: {
|
||||||
|
headers: {
|
||||||
|
'cache-control': 'no-store'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
response: {
|
||||||
|
isError: false,
|
||||||
|
_agenticMeta: {
|
||||||
|
cacheStatus: 'BYPASS'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: 'MCP => OpenAPI origin basic normalized caching',
|
||||||
|
path: '@dev/test-basic-openapi@010332cf/mcp',
|
||||||
|
fixtures: [
|
||||||
|
{
|
||||||
|
request: {
|
||||||
|
name: 'get_post',
|
||||||
|
args: {
|
||||||
|
postId: 1,
|
||||||
|
foo: true,
|
||||||
|
nala: 'kitten'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
response: {
|
||||||
|
isError: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
request: {
|
||||||
|
name: 'get_post',
|
||||||
|
args: {
|
||||||
|
foo: true,
|
||||||
|
postId: 1,
|
||||||
|
nala: 'kitten'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
response: {
|
||||||
|
isError: false,
|
||||||
|
_agenticMeta: {
|
||||||
|
// second request should hit the cache even though the args are in a
|
||||||
|
// different order
|
||||||
|
cacheStatus: 'HIT'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: 'MCP => MCP origin basic "add" tool call success',
|
||||||
|
path: '@dev/test-basic-mcp/mcp',
|
||||||
|
fixtures: [
|
||||||
|
{
|
||||||
|
request: {
|
||||||
|
name: 'add',
|
||||||
|
args: {
|
||||||
|
a: 13,
|
||||||
|
b: 49
|
||||||
|
}
|
||||||
|
},
|
||||||
|
response: {
|
||||||
|
isError: false,
|
||||||
|
content: [{ type: 'text', text: '62' }]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
|
@ -86,10 +86,11 @@ export class DurableMcpServerBase extends McpAgent<
|
||||||
}))
|
}))
|
||||||
|
|
||||||
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
||||||
const { name: toolName, arguments: args } = request.params
|
const { name: toolName, arguments: args, _meta } = request.params
|
||||||
const sessionId = this.ctx.id.toString()
|
const sessionId = this.ctx.id.toString()
|
||||||
const tool = tools.find((tool) => tool.name === toolName)
|
const tool = tools.find((tool) => tool.name === toolName)
|
||||||
|
|
||||||
|
const cacheControl = (_meta?.agentic as any)?.headers?.['cache-control']
|
||||||
let resolvedOriginToolCallResult: ResolvedOriginToolCallResult | undefined
|
let resolvedOriginToolCallResult: ResolvedOriginToolCallResult | undefined
|
||||||
let toolCallResponse: McpToolCallResponse | undefined
|
let toolCallResponse: McpToolCallResponse | undefined
|
||||||
|
|
||||||
|
@ -102,6 +103,7 @@ export class DurableMcpServerBase extends McpAgent<
|
||||||
deployment,
|
deployment,
|
||||||
consumer,
|
consumer,
|
||||||
pricingPlan,
|
pricingPlan,
|
||||||
|
cacheControl,
|
||||||
sessionId,
|
sessionId,
|
||||||
env: this.env,
|
env: this.env,
|
||||||
ip,
|
ip,
|
||||||
|
|
|
@ -38,7 +38,7 @@ export async function resolveHttpEdgeRequest(
|
||||||
|
|
||||||
const cacheControl = isRequestPubliclyCacheable(ctx.req.raw)
|
const cacheControl = isRequestPubliclyCacheable(ctx.req.raw)
|
||||||
? ctx.req.header('cache-control')
|
? ctx.req.header('cache-control')
|
||||||
: 'no-cache'
|
: 'no-store'
|
||||||
|
|
||||||
const { method } = ctx.req
|
const { method } = ctx.req
|
||||||
const requestUrl = new URL(ctx.req.url)
|
const requestUrl = new URL(ctx.req.url)
|
||||||
|
|
|
@ -63,6 +63,7 @@ export async function resolveOriginToolCall({
|
||||||
const numRequestsCost = 1
|
const numRequestsCost = 1
|
||||||
let rateLimitResult: RateLimitResult | undefined
|
let rateLimitResult: RateLimitResult | undefined
|
||||||
let rateLimit: RateLimit | undefined | null
|
let rateLimit: RateLimit | undefined | null
|
||||||
|
let cacheStatus: CacheStatus | undefined
|
||||||
let reportUsage = true
|
let reportUsage = true
|
||||||
|
|
||||||
// Resolve rate limit and whether to report `requests` usage based on the
|
// Resolve rate limit and whether to report `requests` usage based on the
|
||||||
|
@ -100,7 +101,15 @@ export async function resolveOriginToolCall({
|
||||||
rateLimit = toolConfig.rateLimit as RateLimit
|
rateLimit = toolConfig.rateLimit as RateLimit
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!cacheControl) {
|
if (cacheControl) {
|
||||||
|
if (!isCacheControlPubliclyCacheable(cacheControl)) {
|
||||||
|
// Incoming request explicitly requests to bypass the gateway's cache.
|
||||||
|
cacheStatus = 'BYPASS'
|
||||||
|
} else {
|
||||||
|
// TODO: Should we allow incoming cache-control headers to override the
|
||||||
|
// gateway's cache behavior?
|
||||||
|
}
|
||||||
|
} else {
|
||||||
// If the incoming request doesn't specify a desired `cache-control`,
|
// If the incoming request doesn't specify a desired `cache-control`,
|
||||||
// then use a default based on the tool's configured settings.
|
// then use a default based on the tool's configured settings.
|
||||||
if (toolConfig.cacheControl !== undefined) {
|
if (toolConfig.cacheControl !== undefined) {
|
||||||
|
@ -113,6 +122,7 @@ export async function resolveOriginToolCall({
|
||||||
} else {
|
} else {
|
||||||
// Default to not caching any responses.
|
// Default to not caching any responses.
|
||||||
cacheControl = 'no-store'
|
cacheControl = 'no-store'
|
||||||
|
cacheStatus = 'DYNAMIC'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -144,9 +154,20 @@ export async function resolveOriginToolCall({
|
||||||
} else {
|
} else {
|
||||||
assert(toolConfig.enabled, 404, `Tool "${tool.name}" is disabled`)
|
assert(toolConfig.enabled, 404, `Tool "${tool.name}" is disabled`)
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
if (cacheControl) {
|
||||||
|
if (!isCacheControlPubliclyCacheable(cacheControl)) {
|
||||||
|
// Incoming request explicitly requests to bypass the gateway's cache.
|
||||||
|
cacheStatus = 'BYPASS'
|
||||||
|
} else {
|
||||||
|
// TODO: Should we allow incoming cache-control headers to override the
|
||||||
|
// gateway's cache behavior?
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
// Default to not caching any responses.
|
// Default to not caching any responses.
|
||||||
cacheControl ??= 'no-store'
|
cacheControl = 'no-store'
|
||||||
|
cacheStatus = 'DYNAMIC'
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rateLimit) {
|
if (rateLimit) {
|
||||||
|
@ -213,8 +234,9 @@ export async function resolveOriginToolCall({
|
||||||
// Fetch the origin response without caching (useful for debugging)
|
// Fetch the origin response without caching (useful for debugging)
|
||||||
// const originResponse = await fetch(originRequest)
|
// const originResponse = await fetch(originRequest)
|
||||||
|
|
||||||
const cacheStatus =
|
cacheStatus =
|
||||||
(originResponse.headers.get('cf-cache-status') as CacheStatus) ??
|
(originResponse.headers.get('cf-cache-status') as CacheStatus) ??
|
||||||
|
cacheStatus ??
|
||||||
(cacheKey ? 'MISS' : 'BYPASS')
|
(cacheKey ? 'MISS' : 'BYPASS')
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
@ -318,7 +340,7 @@ export async function resolveOriginToolCall({
|
||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
cacheStatus: cacheKey ? 'MISS' : 'BYPASS',
|
cacheStatus: cacheStatus ?? (cacheKey ? 'MISS' : 'BYPASS'),
|
||||||
reportUsage,
|
reportUsage,
|
||||||
rateLimitResult,
|
rateLimitResult,
|
||||||
toolCallArgs,
|
toolCallArgs,
|
||||||
|
|
|
@ -54,7 +54,7 @@ export type RateLimitState = {
|
||||||
|
|
||||||
export type RateLimitCache = Map<string, RateLimitState>
|
export type RateLimitCache = Map<string, RateLimitState>
|
||||||
|
|
||||||
export type CacheStatus = 'HIT' | 'MISS' | 'BYPASS'
|
export type CacheStatus = 'HIT' | 'MISS' | 'BYPASS' | 'DYNAMIC'
|
||||||
export type RequestMode = 'mcp' | 'http'
|
export type RequestMode = 'mcp' | 'http'
|
||||||
|
|
||||||
export type WaitUntil = (promise: Promise<any>) => void
|
export type WaitUntil = (promise: Promise<any>) => void
|
||||||
|
|
|
@ -125,13 +125,20 @@ export const toolConfigSchema = z
|
||||||
pure: z.boolean().optional().default(false),
|
pure: z.boolean().optional().default(false),
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A `Cache-Control` header value to use for caching this tool's responses.
|
* A custom `Cache-Control` header to use for caching this tool's responses.
|
||||||
*
|
*
|
||||||
* If `pure` is `true`, this defaults to: `public, max-age=31560000, s-maxage=31560000, stale-while-revalidate=3600` (cache publicly for up to 1 year).
|
* If set, this field overrides `pure`.
|
||||||
*
|
*
|
||||||
* If `pure` is `false`, this defaults to the origin server's
|
* If not set and `pure` is `true`, the gateway will default to:
|
||||||
* `cache-control` header value. If the origin server does not set a
|
* `public, max-age=31560000, s-maxage=31560000, stale-while-revalidate=3600`
|
||||||
* `cache-control` header, it defaults to `no-store`.
|
* (cache publicly for up to 1 year).
|
||||||
|
*
|
||||||
|
* If not set and `pure` is `false`, the gateway will default to `no-store`
|
||||||
|
* which will disable caching. This is the default gateway behavior for
|
||||||
|
* tools (no caching).
|
||||||
|
*
|
||||||
|
* Note that origin server response headers may also choose to disable
|
||||||
|
* caching on a per-request basis.
|
||||||
*
|
*
|
||||||
* @default undefined
|
* @default undefined
|
||||||
*/
|
*/
|
||||||
|
|
Ładowanie…
Reference in New Issue