AbdulElahGwaith commited on
Commit
cf599c5
·
verified ·
1 Parent(s): 7bc4a3f

Upload folder using huggingface_hub

Browse files
.gitattributes CHANGED
@@ -1,35 +1,3 @@
1
- *.7z filter=lfs diff=lfs merge=lfs -text
2
- *.arrow filter=lfs diff=lfs merge=lfs -text
3
- *.bin filter=lfs diff=lfs merge=lfs -text
4
- *.bz2 filter=lfs diff=lfs merge=lfs -text
5
- *.ckpt filter=lfs diff=lfs merge=lfs -text
6
- *.ftz filter=lfs diff=lfs merge=lfs -text
7
- *.gz filter=lfs diff=lfs merge=lfs -text
8
- *.h5 filter=lfs diff=lfs merge=lfs -text
9
- *.joblib filter=lfs diff=lfs merge=lfs -text
10
- *.lfs.* filter=lfs diff=lfs merge=lfs -text
11
- *.mlmodel filter=lfs diff=lfs merge=lfs -text
12
- *.model filter=lfs diff=lfs merge=lfs -text
13
- *.msgpack filter=lfs diff=lfs merge=lfs -text
14
- *.npy filter=lfs diff=lfs merge=lfs -text
15
- *.npz filter=lfs diff=lfs merge=lfs -text
16
- *.onnx filter=lfs diff=lfs merge=lfs -text
17
- *.ot filter=lfs diff=lfs merge=lfs -text
18
- *.parquet filter=lfs diff=lfs merge=lfs -text
19
- *.pb filter=lfs diff=lfs merge=lfs -text
20
- *.pickle filter=lfs diff=lfs merge=lfs -text
21
- *.pkl filter=lfs diff=lfs merge=lfs -text
22
- *.pt filter=lfs diff=lfs merge=lfs -text
23
- *.pth filter=lfs diff=lfs merge=lfs -text
24
- *.rar filter=lfs diff=lfs merge=lfs -text
25
- *.safetensors filter=lfs diff=lfs merge=lfs -text
26
- saved_model/**/* filter=lfs diff=lfs merge=lfs -text
27
- *.tar.* filter=lfs diff=lfs merge=lfs -text
28
- *.tar filter=lfs diff=lfs merge=lfs -text
29
- *.tflite filter=lfs diff=lfs merge=lfs -text
30
- *.tgz filter=lfs diff=lfs merge=lfs -text
31
- *.wasm filter=lfs diff=lfs merge=lfs -text
32
- *.xz filter=lfs diff=lfs merge=lfs -text
33
- *.zip filter=lfs diff=lfs merge=lfs -text
34
- *.zst filter=lfs diff=lfs merge=lfs -text
35
- *tfevents* filter=lfs diff=lfs merge=lfs -text
 
1
+ Cargo.lock linguist-generated=true
2
+ package-lock.json linguist-generated=true
3
+ uv.lock linguist-generated=true
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
.github/workflows/claude.yml ADDED
@@ -0,0 +1,72 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ name: Claude Code
2
+
3
+ on:
4
+ issue_comment:
5
+ types: [created]
6
+ pull_request_review_comment:
7
+ types: [created]
8
+ issues:
9
+ types: [opened, assigned]
10
+ pull_request_review:
11
+ types: [submitted]
12
+
13
+ jobs:
14
+ claude:
15
+ if: |
16
+ (github.event_name == 'issue_comment' && contains(github.event.comment.body, '@claude')) ||
17
+ (github.event_name == 'pull_request_review_comment' && contains(github.event.comment.body, '@claude')) ||
18
+ (github.event_name == 'pull_request_review' && contains(github.event.review.body, '@claude')) ||
19
+ (github.event_name == 'issues' && (contains(github.event.issue.body, '@claude') || contains(github.event.issue.title, '@claude')))
20
+ runs-on: ubuntu-latest
21
+ permissions:
22
+ contents: read
23
+ pull-requests: read
24
+ issues: read
25
+ id-token: write
26
+ actions: read # Required for Claude to read CI results on PRs
27
+ steps:
28
+ - name: Check repository permissions
29
+ run: |
30
+ # Check if user has at least triage rights on the repository
31
+ PERMISSION=$(gh api "repos/${{ github.repository }}/collaborators/${{ github.actor }}/permission" -q '.permission' 2>/dev/null)
32
+
33
+ case "$PERMISSION" in
34
+ admin|maintain|push|triage)
35
+ echo "✓ User has $PERMISSION rights on the repository"
36
+ exit 0
37
+ ;;
38
+ pull)
39
+ echo "✗ User only has pull (read-only) rights"
40
+ exit 1
41
+ ;;
42
+ *)
43
+ echo "✗ User does not have sufficient permissions"
44
+ exit 1
45
+ ;;
46
+ esac
47
+ env:
48
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
49
+
50
+ - name: Checkout repository
51
+ uses: actions/checkout@v4
52
+ with:
53
+ fetch-depth: 1
54
+
55
+ - name: Run Claude Code
56
+ id: claude
57
+ uses: anthropics/claude-code-action@v1
58
+ with:
59
+ anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
60
+
61
+ # This is an optional setting that allows Claude to read CI results on PRs
62
+ additional_permissions: |
63
+ actions: read
64
+
65
+ # Optional: Give a custom prompt to Claude. If this is not specified, Claude will perform the instructions specified in the comment that tagged it.
66
+ # prompt: 'Update the pull request description to include a summary of changes.'
67
+
68
+ # Optional: Add claude_args to customize behavior and configuration
69
+ # See https://github.com/anthropics/claude-code-action/blob/main/docs/usage.md
70
+ # or https://docs.claude.com/en/docs/claude-code/cli-reference for available options
71
+ # claude_args: '--allowed-tools Bash(gh pr:*)'
72
+
.gitignore ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ build/
2
+
3
+ # Node-generated files
4
+ node_modules/
5
+
6
+ # Python-generated files
7
+ __pycache__/
8
+ *.py[oc]
9
+ dist/
10
+ wheels/
11
+ *.egg-info
12
+
13
+ # Virtual environments
14
+ .venv
15
+
16
+ # Environment variables file
17
+ .env
18
+
19
+ # Rust-generated files
20
+ debug
21
+ target
22
+
23
+ # JetBrains IDEs
24
+ .idea
LICENSE ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Model Context Protocol
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
README.md ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ # Quickstart Resources
2
+
3
+ A repository of servers and clients from the following Model Context Protocol tutorials:
4
+ - [Quickstart](https://modelcontextprotocol.io/quickstart) – a simple MCP weather server
5
+ - [Building MCP clients](https://modelcontextprotocol.io/tutorials/building-a-client) – an LLM-powered chatbot MCP client
mcp-client-python/.env.example ADDED
@@ -0,0 +1 @@
 
 
1
+ ANTHROPIC_API_KEY=
mcp-client-python/.python-version ADDED
@@ -0,0 +1 @@
 
 
1
+ 3.10
mcp-client-python/README.md ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ # An LLM-Powered Chatbot MCP Client written in Python
2
+
3
+ See the [Building MCP clients](https://modelcontextprotocol.io/tutorials/building-a-client) tutorial for more information.
mcp-client-python/client.py ADDED
@@ -0,0 +1,139 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import asyncio
2
+ from contextlib import AsyncExitStack
3
+ from pathlib import Path
4
+
5
+ from anthropic import Anthropic
6
+ from dotenv import load_dotenv
7
+ from mcp import ClientSession, StdioServerParameters
8
+ from mcp.client.stdio import stdio_client
9
+
10
+ load_dotenv() # load environment variables from .env
11
+
12
+ # Claude model constant
13
+ ANTHROPIC_MODEL = "claude-sonnet-4-5"
14
+
15
+
16
+ class MCPClient:
17
+ def __init__(self):
18
+ # Initialize session and client objects
19
+ self.session: ClientSession | None = None
20
+ self.exit_stack = AsyncExitStack()
21
+ self.anthropic = Anthropic()
22
+
23
+ async def connect_to_server(self, server_script_path: str):
24
+ """Connect to an MCP server
25
+
26
+ Args:
27
+ server_script_path: Path to the server script (.py or .js)
28
+ """
29
+ is_python = server_script_path.endswith(".py")
30
+ is_js = server_script_path.endswith(".js")
31
+ if not (is_python or is_js):
32
+ raise ValueError("Server script must be a .py or .js file")
33
+
34
+ if is_python:
35
+ path = Path(server_script_path).resolve()
36
+ server_params = StdioServerParameters(
37
+ command="uv",
38
+ args=["--directory", str(path.parent), "run", path.name],
39
+ env=None,
40
+ )
41
+ else:
42
+ server_params = StdioServerParameters(command="node", args=[server_script_path], env=None)
43
+
44
+ stdio_transport = await self.exit_stack.enter_async_context(stdio_client(server_params))
45
+ self.stdio, self.write = stdio_transport
46
+ self.session = await self.exit_stack.enter_async_context(ClientSession(self.stdio, self.write))
47
+
48
+ await self.session.initialize()
49
+
50
+ # List available tools
51
+ response = await self.session.list_tools()
52
+ tools = response.tools
53
+ print("\nConnected to server with tools:", [tool.name for tool in tools])
54
+
55
+ async def process_query(self, query: str) -> str:
56
+ """Process a query using Claude and available tools"""
57
+ messages = [{"role": "user", "content": query}]
58
+
59
+ response = await self.session.list_tools()
60
+ available_tools = [
61
+ {"name": tool.name, "description": tool.description, "input_schema": tool.inputSchema}
62
+ for tool in response.tools
63
+ ]
64
+
65
+ # Initial Claude API call
66
+ response = self.anthropic.messages.create(
67
+ model=ANTHROPIC_MODEL, max_tokens=1000, messages=messages, tools=available_tools
68
+ )
69
+
70
+ # Process response and handle tool calls
71
+ final_text = []
72
+
73
+ for content in response.content:
74
+ if content.type == "text":
75
+ final_text.append(content.text)
76
+ elif content.type == "tool_use":
77
+ tool_name = content.name
78
+ tool_args = content.input
79
+
80
+ # Execute tool call
81
+ result = await self.session.call_tool(tool_name, tool_args)
82
+ final_text.append(f"[Calling tool {tool_name} with args {tool_args}]")
83
+
84
+ # Continue conversation with tool results
85
+ if hasattr(content, "text") and content.text:
86
+ messages.append({"role": "assistant", "content": content.text})
87
+ messages.append({"role": "user", "content": result.content})
88
+
89
+ # Get next response from Claude
90
+ response = self.anthropic.messages.create(
91
+ model=ANTHROPIC_MODEL,
92
+ max_tokens=1000,
93
+ messages=messages,
94
+ )
95
+
96
+ final_text.append(response.content[0].text)
97
+
98
+ return "\n".join(final_text)
99
+
100
+ async def chat_loop(self):
101
+ """Run an interactive chat loop"""
102
+ print("\nMCP Client Started!")
103
+ print("Type your queries or 'quit' to exit.")
104
+
105
+ while True:
106
+ try:
107
+ query = input("\nQuery: ").strip()
108
+
109
+ if query.lower() == "quit":
110
+ break
111
+
112
+ response = await self.process_query(query)
113
+ print("\n" + response)
114
+
115
+ except Exception as e:
116
+ print(f"\nError: {str(e)}")
117
+
118
+ async def cleanup(self):
119
+ """Clean up resources"""
120
+ await self.exit_stack.aclose()
121
+
122
+
123
+ async def main():
124
+ if len(sys.argv) < 2:
125
+ print("Usage: python client.py <path_to_server_script>")
126
+ sys.exit(1)
127
+
128
+ client = MCPClient()
129
+ try:
130
+ await client.connect_to_server(sys.argv[1])
131
+ await client.chat_loop()
132
+ finally:
133
+ await client.cleanup()
134
+
135
+
136
+ if __name__ == "__main__":
137
+ import sys
138
+
139
+ asyncio.run(main())
mcp-client-python/pyproject.toml ADDED
@@ -0,0 +1,42 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [project]
2
+ name = "mcp-client"
3
+ version = "0.1.0"
4
+ description = "A simple MCP client"
5
+ readme = "README.md"
6
+ requires-python = ">=3.10"
7
+ dependencies = [
8
+ "anthropic>=0.72.0",
9
+ "mcp>=1.21.0",
10
+ "python-dotenv>=1.2.1",
11
+ ]
12
+
13
+ [dependency-groups]
14
+ dev = [
15
+ "ruff>=0.14.9",
16
+ ]
17
+
18
+ [tool.ruff]
19
+ line-length = 120
20
+ target-version = "py310"
21
+ extend-exclude = ["README.md"]
22
+
23
+ [tool.ruff.lint]
24
+ select = [
25
+ "C4", # flake8-comprehensions
26
+ "C90", # mccabe
27
+ "E", # pycodestyle
28
+ "F", # pyflakes
29
+ "I", # isort
30
+ "PERF", # Perflint
31
+ "PL", # Pylint
32
+ "UP", # pyupgrade
33
+ ]
34
+ ignore = ["PERF203", "PLC0415", "PLR0402"]
35
+ mccabe.max-complexity = 24 # Default is 10
36
+
37
+ [tool.ruff.lint.pylint]
38
+ allow-magic-value-types = ["bytes", "float", "int", "str"]
39
+ max-args = 23 # Default is 5
40
+ max-branches = 23 # Default is 12
41
+ max-returns = 13 # Default is 6
42
+ max-statements = 102 # Default is 50
mcp-client-python/uv.lock ADDED
The diff for this file is too large to render. See raw diff
 
mcp-client-typescript/.env.example ADDED
@@ -0,0 +1 @@
 
 
1
+ ANTHROPIC_API_KEY=
mcp-client-typescript/.gitignore ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ /build
2
+ /node_modules
3
+ .env
mcp-client-typescript/README.md ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ # An LLM-Powered Chatbot MCP Client written in TypeScript
2
+
3
+ See the [Building MCP clients](https://modelcontextprotocol.io/tutorials/building-a-client) tutorial for more information.
mcp-client-typescript/index.ts ADDED
@@ -0,0 +1,196 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { Anthropic } from "@anthropic-ai/sdk";
2
+ import {
3
+ MessageParam,
4
+ Tool,
5
+ } from "@anthropic-ai/sdk/resources/messages/messages.mjs";
6
+
7
+ import { Client } from "@modelcontextprotocol/sdk/client/index.js";
8
+ import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
9
+ import readline from "readline/promises";
10
+
11
+ import dotenv from "dotenv";
12
+
13
+ dotenv.config(); // load environment variables from .env
14
+
15
+ const ANTHROPIC_MODEL = "claude-sonnet-4-5";
16
+ const ANTHROPIC_API_KEY = process.env.ANTHROPIC_API_KEY;
17
+ if (!ANTHROPIC_API_KEY) {
18
+ throw new Error("ANTHROPIC_API_KEY is not set");
19
+ }
20
+
21
+ class MCPClient {
22
+ private mcp: Client;
23
+ private anthropic: Anthropic;
24
+ private transport: StdioClientTransport | null = null;
25
+ private tools: Tool[] = [];
26
+
27
+ constructor() {
28
+ // Initialize Anthropic client and MCP client
29
+ this.anthropic = new Anthropic({
30
+ apiKey: ANTHROPIC_API_KEY,
31
+ });
32
+ this.mcp = new Client({ name: "mcp-client-cli", version: "1.0.0" });
33
+ }
34
+
35
+ async connectToServer(serverScriptPath: string) {
36
+ /**
37
+ * Connect to an MCP server
38
+ *
39
+ * @param serverScriptPath - Path to the server script (.py or .js)
40
+ */
41
+ try {
42
+ // Determine script type and appropriate command
43
+ const isJs = serverScriptPath.endsWith(".js");
44
+ const isPy = serverScriptPath.endsWith(".py");
45
+ if (!isJs && !isPy) {
46
+ throw new Error("Server script must be a .js or .py file");
47
+ }
48
+ const command = isPy
49
+ ? process.platform === "win32"
50
+ ? "python"
51
+ : "python3"
52
+ : process.execPath;
53
+
54
+ // Initialize transport and connect to server
55
+ this.transport = new StdioClientTransport({
56
+ command,
57
+ args: [serverScriptPath],
58
+ });
59
+ await this.mcp.connect(this.transport);
60
+
61
+ // List available tools
62
+ const toolsResult = await this.mcp.listTools();
63
+ this.tools = toolsResult.tools.map((tool) => {
64
+ return {
65
+ name: tool.name,
66
+ description: tool.description,
67
+ input_schema: tool.inputSchema,
68
+ };
69
+ });
70
+ console.log(
71
+ "Connected to server with tools:",
72
+ this.tools.map(({ name }) => name),
73
+ );
74
+ } catch (e) {
75
+ console.log("Failed to connect to MCP server: ", e);
76
+ throw e;
77
+ }
78
+ }
79
+
80
+ async processQuery(query: string) {
81
+ /**
82
+ * Process a query using Claude and available tools
83
+ *
84
+ * @param query - The user's input query
85
+ * @returns Processed response as a string
86
+ */
87
+ const messages: MessageParam[] = [
88
+ {
89
+ role: "user",
90
+ content: query,
91
+ },
92
+ ];
93
+
94
+ // Initial Claude API call
95
+ const response = await this.anthropic.messages.create({
96
+ model: ANTHROPIC_MODEL,
97
+ max_tokens: 1000,
98
+ messages,
99
+ tools: this.tools,
100
+ });
101
+
102
+ // Process response and handle tool calls
103
+ const finalText = [];
104
+
105
+ for (const content of response.content) {
106
+ if (content.type === "text") {
107
+ finalText.push(content.text);
108
+ } else if (content.type === "tool_use") {
109
+ // Execute tool call
110
+ const toolName = content.name;
111
+ const toolArgs = content.input as { [x: string]: unknown } | undefined;
112
+
113
+ const result = await this.mcp.callTool({
114
+ name: toolName,
115
+ arguments: toolArgs,
116
+ });
117
+ finalText.push(
118
+ `[Calling tool ${toolName} with args ${JSON.stringify(toolArgs)}]`,
119
+ );
120
+
121
+ // Continue conversation with tool results
122
+ messages.push({
123
+ role: "user",
124
+ content: result.content as string,
125
+ });
126
+
127
+ // Get next response from Claude
128
+ const response = await this.anthropic.messages.create({
129
+ model: ANTHROPIC_MODEL,
130
+ max_tokens: 1000,
131
+ messages,
132
+ });
133
+
134
+ finalText.push(
135
+ response.content[0].type === "text" ? response.content[0].text : "",
136
+ );
137
+ }
138
+ }
139
+
140
+ return finalText.join("\n");
141
+ }
142
+
143
+ async chatLoop() {
144
+ /**
145
+ * Run an interactive chat loop
146
+ */
147
+ const rl = readline.createInterface({
148
+ input: process.stdin,
149
+ output: process.stdout,
150
+ });
151
+
152
+ try {
153
+ console.log("\nMCP Client Started!");
154
+ console.log("Type your queries or 'quit' to exit.");
155
+
156
+ while (true) {
157
+ const message = await rl.question("\nQuery: ");
158
+ if (message.toLowerCase() === "quit") {
159
+ break;
160
+ }
161
+ const response = await this.processQuery(message);
162
+ console.log("\n" + response);
163
+ }
164
+ } finally {
165
+ rl.close();
166
+ }
167
+ }
168
+
169
+ async cleanup() {
170
+ /**
171
+ * Clean up resources
172
+ */
173
+ await this.mcp.close();
174
+ }
175
+ }
176
+
177
+ async function main() {
178
+ if (process.argv.length < 3) {
179
+ console.log("Usage: node build/index.js <path_to_server_script>");
180
+ return;
181
+ }
182
+ const mcpClient = new MCPClient();
183
+ try {
184
+ await mcpClient.connectToServer(process.argv[2]);
185
+ await mcpClient.chatLoop();
186
+ } catch (e) {
187
+ console.error("Error:", e);
188
+ await mcpClient.cleanup();
189
+ process.exit(1);
190
+ } finally {
191
+ await mcpClient.cleanup();
192
+ process.exit(0);
193
+ }
194
+ }
195
+
196
+ main();
mcp-client-typescript/package-lock.json ADDED
@@ -0,0 +1,1505 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "mcp-client-typescript",
3
+ "version": "1.0.0",
4
+ "lockfileVersion": 3,
5
+ "requires": true,
6
+ "packages": {
7
+ "": {
8
+ "name": "mcp-client-typescript",
9
+ "version": "1.0.0",
10
+ "license": "ISC",
11
+ "dependencies": {
12
+ "@anthropic-ai/sdk": "^0.36.3",
13
+ "@modelcontextprotocol/sdk": "^1.25.2",
14
+ "dotenv": "^16.4.7"
15
+ },
16
+ "devDependencies": {
17
+ "@types/node": "^22.13.4",
18
+ "typescript": "^5.7.3"
19
+ },
20
+ "engines": {
21
+ "node": ">=16.0.0"
22
+ }
23
+ },
24
+ "node_modules/@anthropic-ai/sdk": {
25
+ "version": "0.36.3",
26
+ "resolved": "https://registry.npmjs.org/@anthropic-ai/sdk/-/sdk-0.36.3.tgz",
27
+ "integrity": "sha512-+c0mMLxL/17yFZ4P5+U6bTWiCSFZUKJddrv01ud2aFBWnTPLdRncYV76D3q1tqfnL7aCnhRtykFnoCFzvr4U3Q==",
28
+ "license": "MIT",
29
+ "dependencies": {
30
+ "@types/node": "^18.11.18",
31
+ "@types/node-fetch": "^2.6.4",
32
+ "abort-controller": "^3.0.0",
33
+ "agentkeepalive": "^4.2.1",
34
+ "form-data-encoder": "1.7.2",
35
+ "formdata-node": "^4.3.2",
36
+ "node-fetch": "^2.6.7"
37
+ }
38
+ },
39
+ "node_modules/@anthropic-ai/sdk/node_modules/@types/node": {
40
+ "version": "18.19.76",
41
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.76.tgz",
42
+ "integrity": "sha512-yvR7Q9LdPz2vGpmpJX5LolrgRdWvB67MJKDPSgIIzpFbaf9a1j/f5DnLp5VDyHGMR0QZHlTr1afsD87QCXFHKw==",
43
+ "license": "MIT",
44
+ "dependencies": {
45
+ "undici-types": "~5.26.4"
46
+ }
47
+ },
48
+ "node_modules/@anthropic-ai/sdk/node_modules/undici-types": {
49
+ "version": "5.26.5",
50
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
51
+ "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==",
52
+ "license": "MIT"
53
+ },
54
+ "node_modules/@hono/node-server": {
55
+ "version": "1.19.7",
56
+ "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.7.tgz",
57
+ "integrity": "sha512-vUcD0uauS7EU2caukW8z5lJKtoGMokxNbJtBiwHgpqxEXokaHCBkQUmCHhjFB1VUTWdqj25QoMkMKzgjq+uhrw==",
58
+ "license": "MIT",
59
+ "engines": {
60
+ "node": ">=18.14.1"
61
+ },
62
+ "peerDependencies": {
63
+ "hono": "^4"
64
+ }
65
+ },
66
+ "node_modules/@modelcontextprotocol/sdk": {
67
+ "version": "1.25.2",
68
+ "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.25.2.tgz",
69
+ "integrity": "sha512-LZFeo4F9M5qOhC/Uc1aQSrBHxMrvxett+9KLHt7OhcExtoiRN9DKgbZffMP/nxjutWDQpfMDfP3nkHI4X9ijww==",
70
+ "license": "MIT",
71
+ "dependencies": {
72
+ "@hono/node-server": "^1.19.7",
73
+ "ajv": "^8.17.1",
74
+ "ajv-formats": "^3.0.1",
75
+ "content-type": "^1.0.5",
76
+ "cors": "^2.8.5",
77
+ "cross-spawn": "^7.0.5",
78
+ "eventsource": "^3.0.2",
79
+ "eventsource-parser": "^3.0.0",
80
+ "express": "^5.0.1",
81
+ "express-rate-limit": "^7.5.0",
82
+ "jose": "^6.1.1",
83
+ "json-schema-typed": "^8.0.2",
84
+ "pkce-challenge": "^5.0.0",
85
+ "raw-body": "^3.0.0",
86
+ "zod": "^3.25 || ^4.0",
87
+ "zod-to-json-schema": "^3.25.0"
88
+ },
89
+ "engines": {
90
+ "node": ">=18"
91
+ },
92
+ "peerDependencies": {
93
+ "@cfworker/json-schema": "^4.1.1",
94
+ "zod": "^3.25 || ^4.0"
95
+ },
96
+ "peerDependenciesMeta": {
97
+ "@cfworker/json-schema": {
98
+ "optional": true
99
+ },
100
+ "zod": {
101
+ "optional": false
102
+ }
103
+ }
104
+ },
105
+ "node_modules/@types/node": {
106
+ "version": "22.13.4",
107
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.4.tgz",
108
+ "integrity": "sha512-ywP2X0DYtX3y08eFVx5fNIw7/uIv8hYUKgXoK8oayJlLnKcRfEYCxWMVE1XagUdVtCJlZT1AU4LXEABW+L1Peg==",
109
+ "license": "MIT",
110
+ "dependencies": {
111
+ "undici-types": "~6.20.0"
112
+ }
113
+ },
114
+ "node_modules/@types/node-fetch": {
115
+ "version": "2.6.12",
116
+ "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.12.tgz",
117
+ "integrity": "sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA==",
118
+ "license": "MIT",
119
+ "dependencies": {
120
+ "@types/node": "*",
121
+ "form-data": "^4.0.0"
122
+ }
123
+ },
124
+ "node_modules/abort-controller": {
125
+ "version": "3.0.0",
126
+ "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz",
127
+ "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==",
128
+ "license": "MIT",
129
+ "dependencies": {
130
+ "event-target-shim": "^5.0.0"
131
+ },
132
+ "engines": {
133
+ "node": ">=6.5"
134
+ }
135
+ },
136
+ "node_modules/accepts": {
137
+ "version": "2.0.0",
138
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz",
139
+ "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==",
140
+ "license": "MIT",
141
+ "dependencies": {
142
+ "mime-types": "^3.0.0",
143
+ "negotiator": "^1.0.0"
144
+ },
145
+ "engines": {
146
+ "node": ">= 0.6"
147
+ }
148
+ },
149
+ "node_modules/accepts/node_modules/mime-db": {
150
+ "version": "1.54.0",
151
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz",
152
+ "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==",
153
+ "license": "MIT",
154
+ "engines": {
155
+ "node": ">= 0.6"
156
+ }
157
+ },
158
+ "node_modules/accepts/node_modules/mime-types": {
159
+ "version": "3.0.2",
160
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz",
161
+ "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==",
162
+ "license": "MIT",
163
+ "dependencies": {
164
+ "mime-db": "^1.54.0"
165
+ },
166
+ "engines": {
167
+ "node": ">=18"
168
+ },
169
+ "funding": {
170
+ "type": "opencollective",
171
+ "url": "https://opencollective.com/express"
172
+ }
173
+ },
174
+ "node_modules/agentkeepalive": {
175
+ "version": "4.6.0",
176
+ "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.6.0.tgz",
177
+ "integrity": "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==",
178
+ "license": "MIT",
179
+ "dependencies": {
180
+ "humanize-ms": "^1.2.1"
181
+ },
182
+ "engines": {
183
+ "node": ">= 8.0.0"
184
+ }
185
+ },
186
+ "node_modules/ajv": {
187
+ "version": "8.17.1",
188
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
189
+ "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
190
+ "license": "MIT",
191
+ "dependencies": {
192
+ "fast-deep-equal": "^3.1.3",
193
+ "fast-uri": "^3.0.1",
194
+ "json-schema-traverse": "^1.0.0",
195
+ "require-from-string": "^2.0.2"
196
+ },
197
+ "funding": {
198
+ "type": "github",
199
+ "url": "https://github.com/sponsors/epoberezkin"
200
+ }
201
+ },
202
+ "node_modules/ajv-formats": {
203
+ "version": "3.0.1",
204
+ "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz",
205
+ "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==",
206
+ "license": "MIT",
207
+ "dependencies": {
208
+ "ajv": "^8.0.0"
209
+ },
210
+ "peerDependencies": {
211
+ "ajv": "^8.0.0"
212
+ },
213
+ "peerDependenciesMeta": {
214
+ "ajv": {
215
+ "optional": true
216
+ }
217
+ }
218
+ },
219
+ "node_modules/asynckit": {
220
+ "version": "0.4.0",
221
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
222
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
223
+ "license": "MIT"
224
+ },
225
+ "node_modules/body-parser": {
226
+ "version": "2.2.1",
227
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.1.tgz",
228
+ "integrity": "sha512-nfDwkulwiZYQIGwxdy0RUmowMhKcFVcYXUU7m4QlKYim1rUtg83xm2yjZ40QjDuc291AJjjeSc9b++AWHSgSHw==",
229
+ "license": "MIT",
230
+ "dependencies": {
231
+ "bytes": "^3.1.2",
232
+ "content-type": "^1.0.5",
233
+ "debug": "^4.4.3",
234
+ "http-errors": "^2.0.0",
235
+ "iconv-lite": "^0.7.0",
236
+ "on-finished": "^2.4.1",
237
+ "qs": "^6.14.0",
238
+ "raw-body": "^3.0.1",
239
+ "type-is": "^2.0.1"
240
+ },
241
+ "engines": {
242
+ "node": ">=18"
243
+ },
244
+ "funding": {
245
+ "type": "opencollective",
246
+ "url": "https://opencollective.com/express"
247
+ }
248
+ },
249
+ "node_modules/bytes": {
250
+ "version": "3.1.2",
251
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
252
+ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
253
+ "license": "MIT",
254
+ "engines": {
255
+ "node": ">= 0.8"
256
+ }
257
+ },
258
+ "node_modules/call-bind-apply-helpers": {
259
+ "version": "1.0.2",
260
+ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
261
+ "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
262
+ "license": "MIT",
263
+ "dependencies": {
264
+ "es-errors": "^1.3.0",
265
+ "function-bind": "^1.1.2"
266
+ },
267
+ "engines": {
268
+ "node": ">= 0.4"
269
+ }
270
+ },
271
+ "node_modules/call-bound": {
272
+ "version": "1.0.4",
273
+ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
274
+ "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
275
+ "license": "MIT",
276
+ "dependencies": {
277
+ "call-bind-apply-helpers": "^1.0.2",
278
+ "get-intrinsic": "^1.3.0"
279
+ },
280
+ "engines": {
281
+ "node": ">= 0.4"
282
+ },
283
+ "funding": {
284
+ "url": "https://github.com/sponsors/ljharb"
285
+ }
286
+ },
287
+ "node_modules/combined-stream": {
288
+ "version": "1.0.8",
289
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
290
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
291
+ "license": "MIT",
292
+ "dependencies": {
293
+ "delayed-stream": "~1.0.0"
294
+ },
295
+ "engines": {
296
+ "node": ">= 0.8"
297
+ }
298
+ },
299
+ "node_modules/content-disposition": {
300
+ "version": "1.0.1",
301
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz",
302
+ "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==",
303
+ "license": "MIT",
304
+ "engines": {
305
+ "node": ">=18"
306
+ },
307
+ "funding": {
308
+ "type": "opencollective",
309
+ "url": "https://opencollective.com/express"
310
+ }
311
+ },
312
+ "node_modules/content-type": {
313
+ "version": "1.0.5",
314
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
315
+ "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
316
+ "license": "MIT",
317
+ "engines": {
318
+ "node": ">= 0.6"
319
+ }
320
+ },
321
+ "node_modules/cookie": {
322
+ "version": "0.7.2",
323
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz",
324
+ "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==",
325
+ "license": "MIT",
326
+ "engines": {
327
+ "node": ">= 0.6"
328
+ }
329
+ },
330
+ "node_modules/cookie-signature": {
331
+ "version": "1.2.2",
332
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz",
333
+ "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==",
334
+ "license": "MIT",
335
+ "engines": {
336
+ "node": ">=6.6.0"
337
+ }
338
+ },
339
+ "node_modules/cors": {
340
+ "version": "2.8.5",
341
+ "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
342
+ "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
343
+ "license": "MIT",
344
+ "dependencies": {
345
+ "object-assign": "^4",
346
+ "vary": "^1"
347
+ },
348
+ "engines": {
349
+ "node": ">= 0.10"
350
+ }
351
+ },
352
+ "node_modules/cross-spawn": {
353
+ "version": "7.0.6",
354
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
355
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
356
+ "license": "MIT",
357
+ "dependencies": {
358
+ "path-key": "^3.1.0",
359
+ "shebang-command": "^2.0.0",
360
+ "which": "^2.0.1"
361
+ },
362
+ "engines": {
363
+ "node": ">= 8"
364
+ }
365
+ },
366
+ "node_modules/debug": {
367
+ "version": "4.4.3",
368
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
369
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
370
+ "license": "MIT",
371
+ "dependencies": {
372
+ "ms": "^2.1.3"
373
+ },
374
+ "engines": {
375
+ "node": ">=6.0"
376
+ },
377
+ "peerDependenciesMeta": {
378
+ "supports-color": {
379
+ "optional": true
380
+ }
381
+ }
382
+ },
383
+ "node_modules/delayed-stream": {
384
+ "version": "1.0.0",
385
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
386
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
387
+ "license": "MIT",
388
+ "engines": {
389
+ "node": ">=0.4.0"
390
+ }
391
+ },
392
+ "node_modules/depd": {
393
+ "version": "2.0.0",
394
+ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
395
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
396
+ "license": "MIT",
397
+ "engines": {
398
+ "node": ">= 0.8"
399
+ }
400
+ },
401
+ "node_modules/dotenv": {
402
+ "version": "16.4.7",
403
+ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz",
404
+ "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==",
405
+ "license": "BSD-2-Clause",
406
+ "engines": {
407
+ "node": ">=12"
408
+ },
409
+ "funding": {
410
+ "url": "https://dotenvx.com"
411
+ }
412
+ },
413
+ "node_modules/dunder-proto": {
414
+ "version": "1.0.1",
415
+ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
416
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
417
+ "license": "MIT",
418
+ "dependencies": {
419
+ "call-bind-apply-helpers": "^1.0.1",
420
+ "es-errors": "^1.3.0",
421
+ "gopd": "^1.2.0"
422
+ },
423
+ "engines": {
424
+ "node": ">= 0.4"
425
+ }
426
+ },
427
+ "node_modules/ee-first": {
428
+ "version": "1.1.1",
429
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
430
+ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
431
+ "license": "MIT"
432
+ },
433
+ "node_modules/encodeurl": {
434
+ "version": "2.0.0",
435
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
436
+ "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
437
+ "license": "MIT",
438
+ "engines": {
439
+ "node": ">= 0.8"
440
+ }
441
+ },
442
+ "node_modules/es-define-property": {
443
+ "version": "1.0.1",
444
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
445
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
446
+ "license": "MIT",
447
+ "engines": {
448
+ "node": ">= 0.4"
449
+ }
450
+ },
451
+ "node_modules/es-errors": {
452
+ "version": "1.3.0",
453
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
454
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
455
+ "license": "MIT",
456
+ "engines": {
457
+ "node": ">= 0.4"
458
+ }
459
+ },
460
+ "node_modules/es-object-atoms": {
461
+ "version": "1.1.1",
462
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
463
+ "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
464
+ "license": "MIT",
465
+ "dependencies": {
466
+ "es-errors": "^1.3.0"
467
+ },
468
+ "engines": {
469
+ "node": ">= 0.4"
470
+ }
471
+ },
472
+ "node_modules/es-set-tostringtag": {
473
+ "version": "2.1.0",
474
+ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
475
+ "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
476
+ "license": "MIT",
477
+ "dependencies": {
478
+ "es-errors": "^1.3.0",
479
+ "get-intrinsic": "^1.2.6",
480
+ "has-tostringtag": "^1.0.2",
481
+ "hasown": "^2.0.2"
482
+ },
483
+ "engines": {
484
+ "node": ">= 0.4"
485
+ }
486
+ },
487
+ "node_modules/escape-html": {
488
+ "version": "1.0.3",
489
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
490
+ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
491
+ "license": "MIT"
492
+ },
493
+ "node_modules/etag": {
494
+ "version": "1.8.1",
495
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
496
+ "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
497
+ "license": "MIT",
498
+ "engines": {
499
+ "node": ">= 0.6"
500
+ }
501
+ },
502
+ "node_modules/event-target-shim": {
503
+ "version": "5.0.1",
504
+ "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz",
505
+ "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==",
506
+ "license": "MIT",
507
+ "engines": {
508
+ "node": ">=6"
509
+ }
510
+ },
511
+ "node_modules/eventsource": {
512
+ "version": "3.0.5",
513
+ "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.5.tgz",
514
+ "integrity": "sha512-LT/5J605bx5SNyE+ITBDiM3FxffBiq9un7Vx0EwMDM3vg8sWKx/tO2zC+LMqZ+smAM0F2hblaDZUVZF0te2pSw==",
515
+ "license": "MIT",
516
+ "dependencies": {
517
+ "eventsource-parser": "^3.0.0"
518
+ },
519
+ "engines": {
520
+ "node": ">=18.0.0"
521
+ }
522
+ },
523
+ "node_modules/eventsource-parser": {
524
+ "version": "3.0.0",
525
+ "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.0.tgz",
526
+ "integrity": "sha512-T1C0XCUimhxVQzW4zFipdx0SficT651NnkR0ZSH3yQwh+mFMdLfgjABVi4YtMTtaL4s168593DaoaRLMqryavA==",
527
+ "license": "MIT",
528
+ "engines": {
529
+ "node": ">=18.0.0"
530
+ }
531
+ },
532
+ "node_modules/express": {
533
+ "version": "5.2.1",
534
+ "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz",
535
+ "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==",
536
+ "license": "MIT",
537
+ "dependencies": {
538
+ "accepts": "^2.0.0",
539
+ "body-parser": "^2.2.1",
540
+ "content-disposition": "^1.0.0",
541
+ "content-type": "^1.0.5",
542
+ "cookie": "^0.7.1",
543
+ "cookie-signature": "^1.2.1",
544
+ "debug": "^4.4.0",
545
+ "depd": "^2.0.0",
546
+ "encodeurl": "^2.0.0",
547
+ "escape-html": "^1.0.3",
548
+ "etag": "^1.8.1",
549
+ "finalhandler": "^2.1.0",
550
+ "fresh": "^2.0.0",
551
+ "http-errors": "^2.0.0",
552
+ "merge-descriptors": "^2.0.0",
553
+ "mime-types": "^3.0.0",
554
+ "on-finished": "^2.4.1",
555
+ "once": "^1.4.0",
556
+ "parseurl": "^1.3.3",
557
+ "proxy-addr": "^2.0.7",
558
+ "qs": "^6.14.0",
559
+ "range-parser": "^1.2.1",
560
+ "router": "^2.2.0",
561
+ "send": "^1.1.0",
562
+ "serve-static": "^2.2.0",
563
+ "statuses": "^2.0.1",
564
+ "type-is": "^2.0.1",
565
+ "vary": "^1.1.2"
566
+ },
567
+ "engines": {
568
+ "node": ">= 18"
569
+ },
570
+ "funding": {
571
+ "type": "opencollective",
572
+ "url": "https://opencollective.com/express"
573
+ }
574
+ },
575
+ "node_modules/express-rate-limit": {
576
+ "version": "7.5.1",
577
+ "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.5.1.tgz",
578
+ "integrity": "sha512-7iN8iPMDzOMHPUYllBEsQdWVB6fPDMPqwjBaFrgr4Jgr/+okjvzAy+UHlYYL/Vs0OsOrMkwS6PJDkFlJwoxUnw==",
579
+ "license": "MIT",
580
+ "engines": {
581
+ "node": ">= 16"
582
+ },
583
+ "funding": {
584
+ "url": "https://github.com/sponsors/express-rate-limit"
585
+ },
586
+ "peerDependencies": {
587
+ "express": ">= 4.11"
588
+ }
589
+ },
590
+ "node_modules/express/node_modules/mime-db": {
591
+ "version": "1.54.0",
592
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz",
593
+ "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==",
594
+ "license": "MIT",
595
+ "engines": {
596
+ "node": ">= 0.6"
597
+ }
598
+ },
599
+ "node_modules/express/node_modules/mime-types": {
600
+ "version": "3.0.2",
601
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz",
602
+ "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==",
603
+ "license": "MIT",
604
+ "dependencies": {
605
+ "mime-db": "^1.54.0"
606
+ },
607
+ "engines": {
608
+ "node": ">=18"
609
+ },
610
+ "funding": {
611
+ "type": "opencollective",
612
+ "url": "https://opencollective.com/express"
613
+ }
614
+ },
615
+ "node_modules/fast-deep-equal": {
616
+ "version": "3.1.3",
617
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
618
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
619
+ "license": "MIT"
620
+ },
621
+ "node_modules/fast-uri": {
622
+ "version": "3.1.0",
623
+ "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz",
624
+ "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==",
625
+ "funding": [
626
+ {
627
+ "type": "github",
628
+ "url": "https://github.com/sponsors/fastify"
629
+ },
630
+ {
631
+ "type": "opencollective",
632
+ "url": "https://opencollective.com/fastify"
633
+ }
634
+ ],
635
+ "license": "BSD-3-Clause"
636
+ },
637
+ "node_modules/finalhandler": {
638
+ "version": "2.1.1",
639
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz",
640
+ "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==",
641
+ "license": "MIT",
642
+ "dependencies": {
643
+ "debug": "^4.4.0",
644
+ "encodeurl": "^2.0.0",
645
+ "escape-html": "^1.0.3",
646
+ "on-finished": "^2.4.1",
647
+ "parseurl": "^1.3.3",
648
+ "statuses": "^2.0.1"
649
+ },
650
+ "engines": {
651
+ "node": ">= 18.0.0"
652
+ },
653
+ "funding": {
654
+ "type": "opencollective",
655
+ "url": "https://opencollective.com/express"
656
+ }
657
+ },
658
+ "node_modules/form-data": {
659
+ "version": "4.0.4",
660
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz",
661
+ "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==",
662
+ "license": "MIT",
663
+ "dependencies": {
664
+ "asynckit": "^0.4.0",
665
+ "combined-stream": "^1.0.8",
666
+ "es-set-tostringtag": "^2.1.0",
667
+ "hasown": "^2.0.2",
668
+ "mime-types": "^2.1.12"
669
+ },
670
+ "engines": {
671
+ "node": ">= 6"
672
+ }
673
+ },
674
+ "node_modules/form-data-encoder": {
675
+ "version": "1.7.2",
676
+ "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.2.tgz",
677
+ "integrity": "sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==",
678
+ "license": "MIT"
679
+ },
680
+ "node_modules/formdata-node": {
681
+ "version": "4.4.1",
682
+ "resolved": "https://registry.npmjs.org/formdata-node/-/formdata-node-4.4.1.tgz",
683
+ "integrity": "sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==",
684
+ "license": "MIT",
685
+ "dependencies": {
686
+ "node-domexception": "1.0.0",
687
+ "web-streams-polyfill": "4.0.0-beta.3"
688
+ },
689
+ "engines": {
690
+ "node": ">= 12.20"
691
+ }
692
+ },
693
+ "node_modules/forwarded": {
694
+ "version": "0.2.0",
695
+ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
696
+ "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
697
+ "license": "MIT",
698
+ "engines": {
699
+ "node": ">= 0.6"
700
+ }
701
+ },
702
+ "node_modules/fresh": {
703
+ "version": "2.0.0",
704
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz",
705
+ "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==",
706
+ "license": "MIT",
707
+ "engines": {
708
+ "node": ">= 0.8"
709
+ }
710
+ },
711
+ "node_modules/function-bind": {
712
+ "version": "1.1.2",
713
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
714
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
715
+ "license": "MIT",
716
+ "funding": {
717
+ "url": "https://github.com/sponsors/ljharb"
718
+ }
719
+ },
720
+ "node_modules/get-intrinsic": {
721
+ "version": "1.3.0",
722
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
723
+ "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
724
+ "license": "MIT",
725
+ "dependencies": {
726
+ "call-bind-apply-helpers": "^1.0.2",
727
+ "es-define-property": "^1.0.1",
728
+ "es-errors": "^1.3.0",
729
+ "es-object-atoms": "^1.1.1",
730
+ "function-bind": "^1.1.2",
731
+ "get-proto": "^1.0.1",
732
+ "gopd": "^1.2.0",
733
+ "has-symbols": "^1.1.0",
734
+ "hasown": "^2.0.2",
735
+ "math-intrinsics": "^1.1.0"
736
+ },
737
+ "engines": {
738
+ "node": ">= 0.4"
739
+ },
740
+ "funding": {
741
+ "url": "https://github.com/sponsors/ljharb"
742
+ }
743
+ },
744
+ "node_modules/get-proto": {
745
+ "version": "1.0.1",
746
+ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
747
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
748
+ "license": "MIT",
749
+ "dependencies": {
750
+ "dunder-proto": "^1.0.1",
751
+ "es-object-atoms": "^1.0.0"
752
+ },
753
+ "engines": {
754
+ "node": ">= 0.4"
755
+ }
756
+ },
757
+ "node_modules/gopd": {
758
+ "version": "1.2.0",
759
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
760
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
761
+ "license": "MIT",
762
+ "engines": {
763
+ "node": ">= 0.4"
764
+ },
765
+ "funding": {
766
+ "url": "https://github.com/sponsors/ljharb"
767
+ }
768
+ },
769
+ "node_modules/has-symbols": {
770
+ "version": "1.1.0",
771
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
772
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
773
+ "license": "MIT",
774
+ "engines": {
775
+ "node": ">= 0.4"
776
+ },
777
+ "funding": {
778
+ "url": "https://github.com/sponsors/ljharb"
779
+ }
780
+ },
781
+ "node_modules/has-tostringtag": {
782
+ "version": "1.0.2",
783
+ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
784
+ "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
785
+ "license": "MIT",
786
+ "dependencies": {
787
+ "has-symbols": "^1.0.3"
788
+ },
789
+ "engines": {
790
+ "node": ">= 0.4"
791
+ },
792
+ "funding": {
793
+ "url": "https://github.com/sponsors/ljharb"
794
+ }
795
+ },
796
+ "node_modules/hasown": {
797
+ "version": "2.0.2",
798
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
799
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
800
+ "license": "MIT",
801
+ "dependencies": {
802
+ "function-bind": "^1.1.2"
803
+ },
804
+ "engines": {
805
+ "node": ">= 0.4"
806
+ }
807
+ },
808
+ "node_modules/hono": {
809
+ "version": "4.11.4",
810
+ "resolved": "https://registry.npmjs.org/hono/-/hono-4.11.4.tgz",
811
+ "integrity": "sha512-U7tt8JsyrxSRKspfhtLET79pU8K+tInj5QZXs1jSugO1Vq5dFj3kmZsRldo29mTBfcjDRVRXrEZ6LS63Cog9ZA==",
812
+ "license": "MIT",
813
+ "peer": true,
814
+ "engines": {
815
+ "node": ">=16.9.0"
816
+ }
817
+ },
818
+ "node_modules/http-errors": {
819
+ "version": "2.0.1",
820
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz",
821
+ "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==",
822
+ "license": "MIT",
823
+ "dependencies": {
824
+ "depd": "~2.0.0",
825
+ "inherits": "~2.0.4",
826
+ "setprototypeof": "~1.2.0",
827
+ "statuses": "~2.0.2",
828
+ "toidentifier": "~1.0.1"
829
+ },
830
+ "engines": {
831
+ "node": ">= 0.8"
832
+ },
833
+ "funding": {
834
+ "type": "opencollective",
835
+ "url": "https://opencollective.com/express"
836
+ }
837
+ },
838
+ "node_modules/humanize-ms": {
839
+ "version": "1.2.1",
840
+ "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz",
841
+ "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==",
842
+ "license": "MIT",
843
+ "dependencies": {
844
+ "ms": "^2.0.0"
845
+ }
846
+ },
847
+ "node_modules/iconv-lite": {
848
+ "version": "0.7.1",
849
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.1.tgz",
850
+ "integrity": "sha512-2Tth85cXwGFHfvRgZWszZSvdo+0Xsqmw8k8ZwxScfcBneNUraK+dxRxRm24nszx80Y0TVio8kKLt5sLE7ZCLlw==",
851
+ "license": "MIT",
852
+ "dependencies": {
853
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
854
+ },
855
+ "engines": {
856
+ "node": ">=0.10.0"
857
+ },
858
+ "funding": {
859
+ "type": "opencollective",
860
+ "url": "https://opencollective.com/express"
861
+ }
862
+ },
863
+ "node_modules/inherits": {
864
+ "version": "2.0.4",
865
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
866
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
867
+ "license": "ISC"
868
+ },
869
+ "node_modules/ipaddr.js": {
870
+ "version": "1.9.1",
871
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
872
+ "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
873
+ "license": "MIT",
874
+ "engines": {
875
+ "node": ">= 0.10"
876
+ }
877
+ },
878
+ "node_modules/is-promise": {
879
+ "version": "4.0.0",
880
+ "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz",
881
+ "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==",
882
+ "license": "MIT"
883
+ },
884
+ "node_modules/isexe": {
885
+ "version": "2.0.0",
886
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
887
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
888
+ "license": "ISC"
889
+ },
890
+ "node_modules/jose": {
891
+ "version": "6.1.3",
892
+ "resolved": "https://registry.npmjs.org/jose/-/jose-6.1.3.tgz",
893
+ "integrity": "sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ==",
894
+ "license": "MIT",
895
+ "funding": {
896
+ "url": "https://github.com/sponsors/panva"
897
+ }
898
+ },
899
+ "node_modules/json-schema-traverse": {
900
+ "version": "1.0.0",
901
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
902
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
903
+ "license": "MIT"
904
+ },
905
+ "node_modules/json-schema-typed": {
906
+ "version": "8.0.2",
907
+ "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-8.0.2.tgz",
908
+ "integrity": "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==",
909
+ "license": "BSD-2-Clause"
910
+ },
911
+ "node_modules/math-intrinsics": {
912
+ "version": "1.1.0",
913
+ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
914
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
915
+ "license": "MIT",
916
+ "engines": {
917
+ "node": ">= 0.4"
918
+ }
919
+ },
920
+ "node_modules/media-typer": {
921
+ "version": "1.1.0",
922
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz",
923
+ "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==",
924
+ "license": "MIT",
925
+ "engines": {
926
+ "node": ">= 0.8"
927
+ }
928
+ },
929
+ "node_modules/merge-descriptors": {
930
+ "version": "2.0.0",
931
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz",
932
+ "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==",
933
+ "license": "MIT",
934
+ "engines": {
935
+ "node": ">=18"
936
+ },
937
+ "funding": {
938
+ "url": "https://github.com/sponsors/sindresorhus"
939
+ }
940
+ },
941
+ "node_modules/mime-db": {
942
+ "version": "1.52.0",
943
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
944
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
945
+ "license": "MIT",
946
+ "engines": {
947
+ "node": ">= 0.6"
948
+ }
949
+ },
950
+ "node_modules/mime-types": {
951
+ "version": "2.1.35",
952
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
953
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
954
+ "license": "MIT",
955
+ "dependencies": {
956
+ "mime-db": "1.52.0"
957
+ },
958
+ "engines": {
959
+ "node": ">= 0.6"
960
+ }
961
+ },
962
+ "node_modules/ms": {
963
+ "version": "2.1.3",
964
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
965
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
966
+ "license": "MIT"
967
+ },
968
+ "node_modules/negotiator": {
969
+ "version": "1.0.0",
970
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz",
971
+ "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==",
972
+ "license": "MIT",
973
+ "engines": {
974
+ "node": ">= 0.6"
975
+ }
976
+ },
977
+ "node_modules/node-domexception": {
978
+ "version": "1.0.0",
979
+ "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz",
980
+ "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==",
981
+ "funding": [
982
+ {
983
+ "type": "github",
984
+ "url": "https://github.com/sponsors/jimmywarting"
985
+ },
986
+ {
987
+ "type": "github",
988
+ "url": "https://paypal.me/jimmywarting"
989
+ }
990
+ ],
991
+ "license": "MIT",
992
+ "engines": {
993
+ "node": ">=10.5.0"
994
+ }
995
+ },
996
+ "node_modules/node-fetch": {
997
+ "version": "2.7.0",
998
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
999
+ "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
1000
+ "license": "MIT",
1001
+ "dependencies": {
1002
+ "whatwg-url": "^5.0.0"
1003
+ },
1004
+ "engines": {
1005
+ "node": "4.x || >=6.0.0"
1006
+ },
1007
+ "peerDependencies": {
1008
+ "encoding": "^0.1.0"
1009
+ },
1010
+ "peerDependenciesMeta": {
1011
+ "encoding": {
1012
+ "optional": true
1013
+ }
1014
+ }
1015
+ },
1016
+ "node_modules/object-assign": {
1017
+ "version": "4.1.1",
1018
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
1019
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
1020
+ "license": "MIT",
1021
+ "engines": {
1022
+ "node": ">=0.10.0"
1023
+ }
1024
+ },
1025
+ "node_modules/object-inspect": {
1026
+ "version": "1.13.4",
1027
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
1028
+ "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
1029
+ "license": "MIT",
1030
+ "engines": {
1031
+ "node": ">= 0.4"
1032
+ },
1033
+ "funding": {
1034
+ "url": "https://github.com/sponsors/ljharb"
1035
+ }
1036
+ },
1037
+ "node_modules/on-finished": {
1038
+ "version": "2.4.1",
1039
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
1040
+ "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
1041
+ "license": "MIT",
1042
+ "dependencies": {
1043
+ "ee-first": "1.1.1"
1044
+ },
1045
+ "engines": {
1046
+ "node": ">= 0.8"
1047
+ }
1048
+ },
1049
+ "node_modules/once": {
1050
+ "version": "1.4.0",
1051
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
1052
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
1053
+ "license": "ISC",
1054
+ "dependencies": {
1055
+ "wrappy": "1"
1056
+ }
1057
+ },
1058
+ "node_modules/parseurl": {
1059
+ "version": "1.3.3",
1060
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
1061
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
1062
+ "license": "MIT",
1063
+ "engines": {
1064
+ "node": ">= 0.8"
1065
+ }
1066
+ },
1067
+ "node_modules/path-key": {
1068
+ "version": "3.1.1",
1069
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
1070
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
1071
+ "license": "MIT",
1072
+ "engines": {
1073
+ "node": ">=8"
1074
+ }
1075
+ },
1076
+ "node_modules/path-to-regexp": {
1077
+ "version": "8.3.0",
1078
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz",
1079
+ "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==",
1080
+ "license": "MIT",
1081
+ "funding": {
1082
+ "type": "opencollective",
1083
+ "url": "https://opencollective.com/express"
1084
+ }
1085
+ },
1086
+ "node_modules/pkce-challenge": {
1087
+ "version": "5.0.1",
1088
+ "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.1.tgz",
1089
+ "integrity": "sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==",
1090
+ "license": "MIT",
1091
+ "engines": {
1092
+ "node": ">=16.20.0"
1093
+ }
1094
+ },
1095
+ "node_modules/proxy-addr": {
1096
+ "version": "2.0.7",
1097
+ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
1098
+ "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
1099
+ "license": "MIT",
1100
+ "dependencies": {
1101
+ "forwarded": "0.2.0",
1102
+ "ipaddr.js": "1.9.1"
1103
+ },
1104
+ "engines": {
1105
+ "node": ">= 0.10"
1106
+ }
1107
+ },
1108
+ "node_modules/qs": {
1109
+ "version": "6.14.1",
1110
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz",
1111
+ "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==",
1112
+ "license": "BSD-3-Clause",
1113
+ "dependencies": {
1114
+ "side-channel": "^1.1.0"
1115
+ },
1116
+ "engines": {
1117
+ "node": ">=0.6"
1118
+ },
1119
+ "funding": {
1120
+ "url": "https://github.com/sponsors/ljharb"
1121
+ }
1122
+ },
1123
+ "node_modules/range-parser": {
1124
+ "version": "1.2.1",
1125
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
1126
+ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
1127
+ "license": "MIT",
1128
+ "engines": {
1129
+ "node": ">= 0.6"
1130
+ }
1131
+ },
1132
+ "node_modules/raw-body": {
1133
+ "version": "3.0.2",
1134
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz",
1135
+ "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==",
1136
+ "license": "MIT",
1137
+ "dependencies": {
1138
+ "bytes": "~3.1.2",
1139
+ "http-errors": "~2.0.1",
1140
+ "iconv-lite": "~0.7.0",
1141
+ "unpipe": "~1.0.0"
1142
+ },
1143
+ "engines": {
1144
+ "node": ">= 0.10"
1145
+ }
1146
+ },
1147
+ "node_modules/require-from-string": {
1148
+ "version": "2.0.2",
1149
+ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
1150
+ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
1151
+ "license": "MIT",
1152
+ "engines": {
1153
+ "node": ">=0.10.0"
1154
+ }
1155
+ },
1156
+ "node_modules/router": {
1157
+ "version": "2.2.0",
1158
+ "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz",
1159
+ "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==",
1160
+ "license": "MIT",
1161
+ "dependencies": {
1162
+ "debug": "^4.4.0",
1163
+ "depd": "^2.0.0",
1164
+ "is-promise": "^4.0.0",
1165
+ "parseurl": "^1.3.3",
1166
+ "path-to-regexp": "^8.0.0"
1167
+ },
1168
+ "engines": {
1169
+ "node": ">= 18"
1170
+ }
1171
+ },
1172
+ "node_modules/safer-buffer": {
1173
+ "version": "2.1.2",
1174
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
1175
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
1176
+ "license": "MIT"
1177
+ },
1178
+ "node_modules/send": {
1179
+ "version": "1.2.0",
1180
+ "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz",
1181
+ "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==",
1182
+ "license": "MIT",
1183
+ "dependencies": {
1184
+ "debug": "^4.3.5",
1185
+ "encodeurl": "^2.0.0",
1186
+ "escape-html": "^1.0.3",
1187
+ "etag": "^1.8.1",
1188
+ "fresh": "^2.0.0",
1189
+ "http-errors": "^2.0.0",
1190
+ "mime-types": "^3.0.1",
1191
+ "ms": "^2.1.3",
1192
+ "on-finished": "^2.4.1",
1193
+ "range-parser": "^1.2.1",
1194
+ "statuses": "^2.0.1"
1195
+ },
1196
+ "engines": {
1197
+ "node": ">= 18"
1198
+ }
1199
+ },
1200
+ "node_modules/send/node_modules/mime-db": {
1201
+ "version": "1.54.0",
1202
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz",
1203
+ "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==",
1204
+ "license": "MIT",
1205
+ "engines": {
1206
+ "node": ">= 0.6"
1207
+ }
1208
+ },
1209
+ "node_modules/send/node_modules/mime-types": {
1210
+ "version": "3.0.2",
1211
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz",
1212
+ "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==",
1213
+ "license": "MIT",
1214
+ "dependencies": {
1215
+ "mime-db": "^1.54.0"
1216
+ },
1217
+ "engines": {
1218
+ "node": ">=18"
1219
+ },
1220
+ "funding": {
1221
+ "type": "opencollective",
1222
+ "url": "https://opencollective.com/express"
1223
+ }
1224
+ },
1225
+ "node_modules/serve-static": {
1226
+ "version": "2.2.0",
1227
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz",
1228
+ "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==",
1229
+ "license": "MIT",
1230
+ "dependencies": {
1231
+ "encodeurl": "^2.0.0",
1232
+ "escape-html": "^1.0.3",
1233
+ "parseurl": "^1.3.3",
1234
+ "send": "^1.2.0"
1235
+ },
1236
+ "engines": {
1237
+ "node": ">= 18"
1238
+ }
1239
+ },
1240
+ "node_modules/setprototypeof": {
1241
+ "version": "1.2.0",
1242
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
1243
+ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
1244
+ "license": "ISC"
1245
+ },
1246
+ "node_modules/shebang-command": {
1247
+ "version": "2.0.0",
1248
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
1249
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
1250
+ "license": "MIT",
1251
+ "dependencies": {
1252
+ "shebang-regex": "^3.0.0"
1253
+ },
1254
+ "engines": {
1255
+ "node": ">=8"
1256
+ }
1257
+ },
1258
+ "node_modules/shebang-regex": {
1259
+ "version": "3.0.0",
1260
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
1261
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
1262
+ "license": "MIT",
1263
+ "engines": {
1264
+ "node": ">=8"
1265
+ }
1266
+ },
1267
+ "node_modules/side-channel": {
1268
+ "version": "1.1.0",
1269
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
1270
+ "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
1271
+ "license": "MIT",
1272
+ "dependencies": {
1273
+ "es-errors": "^1.3.0",
1274
+ "object-inspect": "^1.13.3",
1275
+ "side-channel-list": "^1.0.0",
1276
+ "side-channel-map": "^1.0.1",
1277
+ "side-channel-weakmap": "^1.0.2"
1278
+ },
1279
+ "engines": {
1280
+ "node": ">= 0.4"
1281
+ },
1282
+ "funding": {
1283
+ "url": "https://github.com/sponsors/ljharb"
1284
+ }
1285
+ },
1286
+ "node_modules/side-channel-list": {
1287
+ "version": "1.0.0",
1288
+ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
1289
+ "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
1290
+ "license": "MIT",
1291
+ "dependencies": {
1292
+ "es-errors": "^1.3.0",
1293
+ "object-inspect": "^1.13.3"
1294
+ },
1295
+ "engines": {
1296
+ "node": ">= 0.4"
1297
+ },
1298
+ "funding": {
1299
+ "url": "https://github.com/sponsors/ljharb"
1300
+ }
1301
+ },
1302
+ "node_modules/side-channel-map": {
1303
+ "version": "1.0.1",
1304
+ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
1305
+ "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
1306
+ "license": "MIT",
1307
+ "dependencies": {
1308
+ "call-bound": "^1.0.2",
1309
+ "es-errors": "^1.3.0",
1310
+ "get-intrinsic": "^1.2.5",
1311
+ "object-inspect": "^1.13.3"
1312
+ },
1313
+ "engines": {
1314
+ "node": ">= 0.4"
1315
+ },
1316
+ "funding": {
1317
+ "url": "https://github.com/sponsors/ljharb"
1318
+ }
1319
+ },
1320
+ "node_modules/side-channel-weakmap": {
1321
+ "version": "1.0.2",
1322
+ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
1323
+ "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
1324
+ "license": "MIT",
1325
+ "dependencies": {
1326
+ "call-bound": "^1.0.2",
1327
+ "es-errors": "^1.3.0",
1328
+ "get-intrinsic": "^1.2.5",
1329
+ "object-inspect": "^1.13.3",
1330
+ "side-channel-map": "^1.0.1"
1331
+ },
1332
+ "engines": {
1333
+ "node": ">= 0.4"
1334
+ },
1335
+ "funding": {
1336
+ "url": "https://github.com/sponsors/ljharb"
1337
+ }
1338
+ },
1339
+ "node_modules/statuses": {
1340
+ "version": "2.0.2",
1341
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz",
1342
+ "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==",
1343
+ "license": "MIT",
1344
+ "engines": {
1345
+ "node": ">= 0.8"
1346
+ }
1347
+ },
1348
+ "node_modules/toidentifier": {
1349
+ "version": "1.0.1",
1350
+ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
1351
+ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
1352
+ "license": "MIT",
1353
+ "engines": {
1354
+ "node": ">=0.6"
1355
+ }
1356
+ },
1357
+ "node_modules/tr46": {
1358
+ "version": "0.0.3",
1359
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
1360
+ "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==",
1361
+ "license": "MIT"
1362
+ },
1363
+ "node_modules/type-is": {
1364
+ "version": "2.0.1",
1365
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz",
1366
+ "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==",
1367
+ "license": "MIT",
1368
+ "dependencies": {
1369
+ "content-type": "^1.0.5",
1370
+ "media-typer": "^1.1.0",
1371
+ "mime-types": "^3.0.0"
1372
+ },
1373
+ "engines": {
1374
+ "node": ">= 0.6"
1375
+ }
1376
+ },
1377
+ "node_modules/type-is/node_modules/mime-db": {
1378
+ "version": "1.54.0",
1379
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz",
1380
+ "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==",
1381
+ "license": "MIT",
1382
+ "engines": {
1383
+ "node": ">= 0.6"
1384
+ }
1385
+ },
1386
+ "node_modules/type-is/node_modules/mime-types": {
1387
+ "version": "3.0.2",
1388
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz",
1389
+ "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==",
1390
+ "license": "MIT",
1391
+ "dependencies": {
1392
+ "mime-db": "^1.54.0"
1393
+ },
1394
+ "engines": {
1395
+ "node": ">=18"
1396
+ },
1397
+ "funding": {
1398
+ "type": "opencollective",
1399
+ "url": "https://opencollective.com/express"
1400
+ }
1401
+ },
1402
+ "node_modules/typescript": {
1403
+ "version": "5.7.3",
1404
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz",
1405
+ "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==",
1406
+ "dev": true,
1407
+ "license": "Apache-2.0",
1408
+ "bin": {
1409
+ "tsc": "bin/tsc",
1410
+ "tsserver": "bin/tsserver"
1411
+ },
1412
+ "engines": {
1413
+ "node": ">=14.17"
1414
+ }
1415
+ },
1416
+ "node_modules/undici-types": {
1417
+ "version": "6.20.0",
1418
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz",
1419
+ "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==",
1420
+ "license": "MIT"
1421
+ },
1422
+ "node_modules/unpipe": {
1423
+ "version": "1.0.0",
1424
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
1425
+ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
1426
+ "license": "MIT",
1427
+ "engines": {
1428
+ "node": ">= 0.8"
1429
+ }
1430
+ },
1431
+ "node_modules/vary": {
1432
+ "version": "1.1.2",
1433
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
1434
+ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
1435
+ "license": "MIT",
1436
+ "engines": {
1437
+ "node": ">= 0.8"
1438
+ }
1439
+ },
1440
+ "node_modules/web-streams-polyfill": {
1441
+ "version": "4.0.0-beta.3",
1442
+ "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz",
1443
+ "integrity": "sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==",
1444
+ "license": "MIT",
1445
+ "engines": {
1446
+ "node": ">= 14"
1447
+ }
1448
+ },
1449
+ "node_modules/webidl-conversions": {
1450
+ "version": "3.0.1",
1451
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
1452
+ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
1453
+ "license": "BSD-2-Clause"
1454
+ },
1455
+ "node_modules/whatwg-url": {
1456
+ "version": "5.0.0",
1457
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
1458
+ "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
1459
+ "license": "MIT",
1460
+ "dependencies": {
1461
+ "tr46": "~0.0.3",
1462
+ "webidl-conversions": "^3.0.0"
1463
+ }
1464
+ },
1465
+ "node_modules/which": {
1466
+ "version": "2.0.2",
1467
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
1468
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
1469
+ "license": "ISC",
1470
+ "dependencies": {
1471
+ "isexe": "^2.0.0"
1472
+ },
1473
+ "bin": {
1474
+ "node-which": "bin/node-which"
1475
+ },
1476
+ "engines": {
1477
+ "node": ">= 8"
1478
+ }
1479
+ },
1480
+ "node_modules/wrappy": {
1481
+ "version": "1.0.2",
1482
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
1483
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
1484
+ "license": "ISC"
1485
+ },
1486
+ "node_modules/zod": {
1487
+ "version": "4.1.13",
1488
+ "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.13.tgz",
1489
+ "integrity": "sha512-AvvthqfqrAhNH9dnfmrfKzX5upOdjUVJYFqNSlkmGf64gRaTzlPwz99IHYnVs28qYAybvAlBV+H7pn0saFY4Ig==",
1490
+ "license": "MIT",
1491
+ "funding": {
1492
+ "url": "https://github.com/sponsors/colinhacks"
1493
+ }
1494
+ },
1495
+ "node_modules/zod-to-json-schema": {
1496
+ "version": "3.25.0",
1497
+ "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.0.tgz",
1498
+ "integrity": "sha512-HvWtU2UG41LALjajJrML6uQejQhNJx+JBO9IflpSja4R03iNWfKXrj6W2h7ljuLyc1nKS+9yDyL/9tD1U/yBnQ==",
1499
+ "license": "ISC",
1500
+ "peerDependencies": {
1501
+ "zod": "^3.25 || ^4"
1502
+ }
1503
+ }
1504
+ }
1505
+ }
mcp-client-typescript/package.json ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "mcp-client-typescript",
3
+ "version": "1.0.0",
4
+ "main": "index.js",
5
+ "scripts": {
6
+ "test": "echo \"Error: no test specified\" && exit 1",
7
+ "build": "tsc && node -e \"require('fs').chmodSync('build/index.js', '755')\""
8
+ },
9
+ "keywords": [],
10
+ "author": "",
11
+ "license": "ISC",
12
+ "type": "module",
13
+ "dependencies": {
14
+ "@anthropic-ai/sdk": "^0.36.3",
15
+ "@modelcontextprotocol/sdk": "^1.25.2",
16
+ "dotenv": "^16.4.7"
17
+ },
18
+ "devDependencies": {
19
+ "@types/node": "^22.13.4",
20
+ "typescript": "^5.7.3"
21
+ },
22
+ "engines": {
23
+ "node": ">=16.0.0"
24
+ }
25
+ }
mcp-client-typescript/tsconfig.json ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "module": "Node16",
5
+ "moduleResolution": "Node16",
6
+ "outDir": "./build",
7
+ "rootDir": "./",
8
+ "strict": true,
9
+ "esModuleInterop": true,
10
+ "skipLibCheck": true,
11
+ "forceConsistentCasingInFileNames": true
12
+ },
13
+ "include": ["index.ts"],
14
+ "exclude": ["node_modules"]
15
+ }
weather-server-python/.python-version ADDED
@@ -0,0 +1 @@
 
 
1
+ 3.10
weather-server-python/README.md ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ # A Simple MCP Weather Server written in Python
2
+
3
+ See the [Quickstart](https://modelcontextprotocol.io/quickstart) tutorial for more information.
weather-server-python/pyproject.toml ADDED
@@ -0,0 +1,48 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [project]
2
+ name = "weather"
3
+ version = "0.1.0"
4
+ description = "A simple MCP weather server"
5
+ readme = "README.md"
6
+ requires-python = ">=3.10"
7
+ dependencies = [
8
+ "httpx>=0.28.1",
9
+ "mcp[cli]>=1.21.0",
10
+ ]
11
+
12
+ [build-system]
13
+ requires = [ "hatchling",]
14
+ build-backend = "hatchling.build"
15
+
16
+ [dependency-groups]
17
+ dev = [
18
+ "ruff>=0.14.8",
19
+ ]
20
+
21
+ [project.scripts]
22
+ weather = "weather:main"
23
+
24
+ [tool.ruff]
25
+ line-length = 120
26
+ target-version = "py310"
27
+ extend-exclude = ["README.md"]
28
+
29
+ [tool.ruff.lint]
30
+ select = [
31
+ "C4", # flake8-comprehensions
32
+ "C90", # mccabe
33
+ "E", # pycodestyle
34
+ "F", # pyflakes
35
+ "I", # isort
36
+ "PERF", # Perflint
37
+ "PL", # Pylint
38
+ "UP", # pyupgrade
39
+ ]
40
+ ignore = ["PERF203", "PLC0415", "PLR0402"]
41
+ mccabe.max-complexity = 24 # Default is 10
42
+
43
+ [tool.ruff.lint.pylint]
44
+ allow-magic-value-types = ["bytes", "float", "int", "str"]
45
+ max-args = 23 # Default is 5
46
+ max-branches = 23 # Default is 12
47
+ max-returns = 13 # Default is 6
48
+ max-statements = 102 # Default is 50
weather-server-python/uv.lock ADDED
The diff for this file is too large to render. See raw diff
 
weather-server-python/weather.py ADDED
@@ -0,0 +1,101 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from typing import Any
2
+
3
+ import httpx
4
+ from mcp.server.fastmcp import FastMCP
5
+
6
+ # Initialize FastMCP server
7
+ mcp = FastMCP("weather")
8
+
9
+ # Constants
10
+ NWS_API_BASE = "https://api.weather.gov"
11
+ USER_AGENT = "weather-app/1.0"
12
+
13
+
14
+ async def make_nws_request(url: str) -> dict[str, Any] | None:
15
+ """Make a request to the NWS API with proper error handling."""
16
+ headers = {"User-Agent": USER_AGENT, "Accept": "application/geo+json"}
17
+ async with httpx.AsyncClient() as client:
18
+ try:
19
+ response = await client.get(url, headers=headers, timeout=30.0)
20
+ response.raise_for_status()
21
+ return response.json()
22
+ except Exception:
23
+ return None
24
+
25
+
26
+ def format_alert(feature: dict) -> str:
27
+ """Format an alert feature into a readable string."""
28
+ props = feature["properties"]
29
+ return f"""
30
+ Event: {props.get("event", "Unknown")}
31
+ Area: {props.get("areaDesc", "Unknown")}
32
+ Severity: {props.get("severity", "Unknown")}
33
+ Description: {props.get("description", "No description available")}
34
+ Instructions: {props.get("instruction", "No specific instructions provided")}
35
+ """
36
+
37
+
38
+ @mcp.tool()
39
+ async def get_alerts(state: str) -> str:
40
+ """Get weather alerts for a US state.
41
+
42
+ Args:
43
+ state: Two-letter US state code (e.g. CA, NY)
44
+ """
45
+ url = f"{NWS_API_BASE}/alerts/active/area/{state}"
46
+ data = await make_nws_request(url)
47
+
48
+ if not data or "features" not in data:
49
+ return "Unable to fetch alerts or no alerts found."
50
+
51
+ if not data["features"]:
52
+ return "No active alerts for this state."
53
+
54
+ alerts = [format_alert(feature) for feature in data["features"]]
55
+ return "\n---\n".join(alerts)
56
+
57
+
58
+ @mcp.tool()
59
+ async def get_forecast(latitude: float, longitude: float) -> str:
60
+ """Get weather forecast for a location.
61
+
62
+ Args:
63
+ latitude: Latitude of the location
64
+ longitude: Longitude of the location
65
+ """
66
+ # First get the forecast grid endpoint
67
+ points_url = f"{NWS_API_BASE}/points/{latitude},{longitude}"
68
+ points_data = await make_nws_request(points_url)
69
+
70
+ if not points_data:
71
+ return "Unable to fetch forecast data for this location."
72
+
73
+ # Get the forecast URL from the points response
74
+ forecast_url = points_data["properties"]["forecast"]
75
+ forecast_data = await make_nws_request(forecast_url)
76
+
77
+ if not forecast_data:
78
+ return "Unable to fetch detailed forecast."
79
+
80
+ # Format the periods into a readable forecast
81
+ periods = forecast_data["properties"]["periods"]
82
+ forecasts = []
83
+ for period in periods[:5]: # Only show next 5 periods
84
+ forecast = f"""
85
+ {period["name"]}:
86
+ Temperature: {period["temperature"]}°{period["temperatureUnit"]}
87
+ Wind: {period["windSpeed"]} {period["windDirection"]}
88
+ Forecast: {period["detailedForecast"]}
89
+ """
90
+ forecasts.append(forecast)
91
+
92
+ return "\n---\n".join(forecasts)
93
+
94
+
95
+ def main():
96
+ # Initialize and run the server
97
+ mcp.run(transport="stdio")
98
+
99
+
100
+ if __name__ == "__main__":
101
+ main()
weather-server-rust/Cargo.lock ADDED
@@ -0,0 +1,2115 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # This file is automatically @generated by Cargo.
2
+ # It is not intended for manual editing.
3
+ version = 4
4
+
5
+ [[package]]
6
+ name = "addr2line"
7
+ version = "0.24.2"
8
+ source = "registry+https://github.com/rust-lang/crates.io-index"
9
+ checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1"
10
+ dependencies = [
11
+ "gimli",
12
+ ]
13
+
14
+ [[package]]
15
+ name = "adler2"
16
+ version = "2.0.1"
17
+ source = "registry+https://github.com/rust-lang/crates.io-index"
18
+ checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa"
19
+
20
+ [[package]]
21
+ name = "aho-corasick"
22
+ version = "1.1.3"
23
+ source = "registry+https://github.com/rust-lang/crates.io-index"
24
+ checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916"
25
+ dependencies = [
26
+ "memchr",
27
+ ]
28
+
29
+ [[package]]
30
+ name = "android-tzdata"
31
+ version = "0.1.1"
32
+ source = "registry+https://github.com/rust-lang/crates.io-index"
33
+ checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0"
34
+
35
+ [[package]]
36
+ name = "android_system_properties"
37
+ version = "0.1.5"
38
+ source = "registry+https://github.com/rust-lang/crates.io-index"
39
+ checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
40
+ dependencies = [
41
+ "libc",
42
+ ]
43
+
44
+ [[package]]
45
+ name = "anyhow"
46
+ version = "1.0.98"
47
+ source = "registry+https://github.com/rust-lang/crates.io-index"
48
+ checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487"
49
+
50
+ [[package]]
51
+ name = "atomic-waker"
52
+ version = "1.1.2"
53
+ source = "registry+https://github.com/rust-lang/crates.io-index"
54
+ checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0"
55
+
56
+ [[package]]
57
+ name = "autocfg"
58
+ version = "1.5.0"
59
+ source = "registry+https://github.com/rust-lang/crates.io-index"
60
+ checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8"
61
+
62
+ [[package]]
63
+ name = "backtrace"
64
+ version = "0.3.75"
65
+ source = "registry+https://github.com/rust-lang/crates.io-index"
66
+ checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002"
67
+ dependencies = [
68
+ "addr2line",
69
+ "cfg-if",
70
+ "libc",
71
+ "miniz_oxide",
72
+ "object",
73
+ "rustc-demangle",
74
+ "windows-targets 0.52.6",
75
+ ]
76
+
77
+ [[package]]
78
+ name = "base64"
79
+ version = "0.22.1"
80
+ source = "registry+https://github.com/rust-lang/crates.io-index"
81
+ checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6"
82
+
83
+ [[package]]
84
+ name = "bitflags"
85
+ version = "2.9.1"
86
+ source = "registry+https://github.com/rust-lang/crates.io-index"
87
+ checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967"
88
+
89
+ [[package]]
90
+ name = "bumpalo"
91
+ version = "3.19.0"
92
+ source = "registry+https://github.com/rust-lang/crates.io-index"
93
+ checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43"
94
+
95
+ [[package]]
96
+ name = "bytes"
97
+ version = "1.10.1"
98
+ source = "registry+https://github.com/rust-lang/crates.io-index"
99
+ checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a"
100
+
101
+ [[package]]
102
+ name = "cc"
103
+ version = "1.2.30"
104
+ source = "registry+https://github.com/rust-lang/crates.io-index"
105
+ checksum = "deec109607ca693028562ed836a5f1c4b8bd77755c4e132fc5ce11b0b6211ae7"
106
+ dependencies = [
107
+ "shlex",
108
+ ]
109
+
110
+ [[package]]
111
+ name = "cfg-if"
112
+ version = "1.0.1"
113
+ source = "registry+https://github.com/rust-lang/crates.io-index"
114
+ checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268"
115
+
116
+ [[package]]
117
+ name = "chrono"
118
+ version = "0.4.41"
119
+ source = "registry+https://github.com/rust-lang/crates.io-index"
120
+ checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d"
121
+ dependencies = [
122
+ "android-tzdata",
123
+ "iana-time-zone",
124
+ "js-sys",
125
+ "num-traits",
126
+ "serde",
127
+ "wasm-bindgen",
128
+ "windows-link",
129
+ ]
130
+
131
+ [[package]]
132
+ name = "core-foundation"
133
+ version = "0.9.4"
134
+ source = "registry+https://github.com/rust-lang/crates.io-index"
135
+ checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f"
136
+ dependencies = [
137
+ "core-foundation-sys",
138
+ "libc",
139
+ ]
140
+
141
+ [[package]]
142
+ name = "core-foundation-sys"
143
+ version = "0.8.7"
144
+ source = "registry+https://github.com/rust-lang/crates.io-index"
145
+ checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
146
+
147
+ [[package]]
148
+ name = "darling"
149
+ version = "0.21.0"
150
+ source = "registry+https://github.com/rust-lang/crates.io-index"
151
+ checksum = "a79c4acb1fd5fa3d9304be4c76e031c54d2e92d172a393e24b19a14fe8532fe9"
152
+ dependencies = [
153
+ "darling_core",
154
+ "darling_macro",
155
+ ]
156
+
157
+ [[package]]
158
+ name = "darling_core"
159
+ version = "0.21.0"
160
+ source = "registry+https://github.com/rust-lang/crates.io-index"
161
+ checksum = "74875de90daf30eb59609910b84d4d368103aaec4c924824c6799b28f77d6a1d"
162
+ dependencies = [
163
+ "fnv",
164
+ "ident_case",
165
+ "proc-macro2",
166
+ "quote",
167
+ "strsim",
168
+ "syn",
169
+ ]
170
+
171
+ [[package]]
172
+ name = "darling_macro"
173
+ version = "0.21.0"
174
+ source = "registry+https://github.com/rust-lang/crates.io-index"
175
+ checksum = "e79f8e61677d5df9167cd85265f8e5f64b215cdea3fb55eebc3e622e44c7a146"
176
+ dependencies = [
177
+ "darling_core",
178
+ "quote",
179
+ "syn",
180
+ ]
181
+
182
+ [[package]]
183
+ name = "displaydoc"
184
+ version = "0.2.5"
185
+ source = "registry+https://github.com/rust-lang/crates.io-index"
186
+ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0"
187
+ dependencies = [
188
+ "proc-macro2",
189
+ "quote",
190
+ "syn",
191
+ ]
192
+
193
+ [[package]]
194
+ name = "dyn-clone"
195
+ version = "1.0.19"
196
+ source = "registry+https://github.com/rust-lang/crates.io-index"
197
+ checksum = "1c7a8fb8a9fbf66c1f703fe16184d10ca0ee9d23be5b4436400408ba54a95005"
198
+
199
+ [[package]]
200
+ name = "encoding_rs"
201
+ version = "0.8.35"
202
+ source = "registry+https://github.com/rust-lang/crates.io-index"
203
+ checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3"
204
+ dependencies = [
205
+ "cfg-if",
206
+ ]
207
+
208
+ [[package]]
209
+ name = "equivalent"
210
+ version = "1.0.2"
211
+ source = "registry+https://github.com/rust-lang/crates.io-index"
212
+ checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
213
+
214
+ [[package]]
215
+ name = "errno"
216
+ version = "0.3.13"
217
+ source = "registry+https://github.com/rust-lang/crates.io-index"
218
+ checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad"
219
+ dependencies = [
220
+ "libc",
221
+ "windows-sys 0.60.2",
222
+ ]
223
+
224
+ [[package]]
225
+ name = "fastrand"
226
+ version = "2.3.0"
227
+ source = "registry+https://github.com/rust-lang/crates.io-index"
228
+ checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be"
229
+
230
+ [[package]]
231
+ name = "fnv"
232
+ version = "1.0.7"
233
+ source = "registry+https://github.com/rust-lang/crates.io-index"
234
+ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
235
+
236
+ [[package]]
237
+ name = "foreign-types"
238
+ version = "0.3.2"
239
+ source = "registry+https://github.com/rust-lang/crates.io-index"
240
+ checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1"
241
+ dependencies = [
242
+ "foreign-types-shared",
243
+ ]
244
+
245
+ [[package]]
246
+ name = "foreign-types-shared"
247
+ version = "0.1.1"
248
+ source = "registry+https://github.com/rust-lang/crates.io-index"
249
+ checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b"
250
+
251
+ [[package]]
252
+ name = "form_urlencoded"
253
+ version = "1.2.1"
254
+ source = "registry+https://github.com/rust-lang/crates.io-index"
255
+ checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456"
256
+ dependencies = [
257
+ "percent-encoding",
258
+ ]
259
+
260
+ [[package]]
261
+ name = "futures"
262
+ version = "0.3.31"
263
+ source = "registry+https://github.com/rust-lang/crates.io-index"
264
+ checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876"
265
+ dependencies = [
266
+ "futures-channel",
267
+ "futures-core",
268
+ "futures-executor",
269
+ "futures-io",
270
+ "futures-sink",
271
+ "futures-task",
272
+ "futures-util",
273
+ ]
274
+
275
+ [[package]]
276
+ name = "futures-channel"
277
+ version = "0.3.31"
278
+ source = "registry+https://github.com/rust-lang/crates.io-index"
279
+ checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10"
280
+ dependencies = [
281
+ "futures-core",
282
+ "futures-sink",
283
+ ]
284
+
285
+ [[package]]
286
+ name = "futures-core"
287
+ version = "0.3.31"
288
+ source = "registry+https://github.com/rust-lang/crates.io-index"
289
+ checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e"
290
+
291
+ [[package]]
292
+ name = "futures-executor"
293
+ version = "0.3.31"
294
+ source = "registry+https://github.com/rust-lang/crates.io-index"
295
+ checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f"
296
+ dependencies = [
297
+ "futures-core",
298
+ "futures-task",
299
+ "futures-util",
300
+ ]
301
+
302
+ [[package]]
303
+ name = "futures-io"
304
+ version = "0.3.31"
305
+ source = "registry+https://github.com/rust-lang/crates.io-index"
306
+ checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6"
307
+
308
+ [[package]]
309
+ name = "futures-macro"
310
+ version = "0.3.31"
311
+ source = "registry+https://github.com/rust-lang/crates.io-index"
312
+ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650"
313
+ dependencies = [
314
+ "proc-macro2",
315
+ "quote",
316
+ "syn",
317
+ ]
318
+
319
+ [[package]]
320
+ name = "futures-sink"
321
+ version = "0.3.31"
322
+ source = "registry+https://github.com/rust-lang/crates.io-index"
323
+ checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7"
324
+
325
+ [[package]]
326
+ name = "futures-task"
327
+ version = "0.3.31"
328
+ source = "registry+https://github.com/rust-lang/crates.io-index"
329
+ checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988"
330
+
331
+ [[package]]
332
+ name = "futures-util"
333
+ version = "0.3.31"
334
+ source = "registry+https://github.com/rust-lang/crates.io-index"
335
+ checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81"
336
+ dependencies = [
337
+ "futures-channel",
338
+ "futures-core",
339
+ "futures-io",
340
+ "futures-macro",
341
+ "futures-sink",
342
+ "futures-task",
343
+ "memchr",
344
+ "pin-project-lite",
345
+ "pin-utils",
346
+ "slab",
347
+ ]
348
+
349
+ [[package]]
350
+ name = "getrandom"
351
+ version = "0.2.16"
352
+ source = "registry+https://github.com/rust-lang/crates.io-index"
353
+ checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592"
354
+ dependencies = [
355
+ "cfg-if",
356
+ "libc",
357
+ "wasi 0.11.1+wasi-snapshot-preview1",
358
+ ]
359
+
360
+ [[package]]
361
+ name = "getrandom"
362
+ version = "0.3.3"
363
+ source = "registry+https://github.com/rust-lang/crates.io-index"
364
+ checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4"
365
+ dependencies = [
366
+ "cfg-if",
367
+ "libc",
368
+ "r-efi",
369
+ "wasi 0.14.2+wasi-0.2.4",
370
+ ]
371
+
372
+ [[package]]
373
+ name = "gimli"
374
+ version = "0.31.1"
375
+ source = "registry+https://github.com/rust-lang/crates.io-index"
376
+ checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f"
377
+
378
+ [[package]]
379
+ name = "h2"
380
+ version = "0.4.11"
381
+ source = "registry+https://github.com/rust-lang/crates.io-index"
382
+ checksum = "17da50a276f1e01e0ba6c029e47b7100754904ee8a278f886546e98575380785"
383
+ dependencies = [
384
+ "atomic-waker",
385
+ "bytes",
386
+ "fnv",
387
+ "futures-core",
388
+ "futures-sink",
389
+ "http",
390
+ "indexmap",
391
+ "slab",
392
+ "tokio",
393
+ "tokio-util",
394
+ "tracing",
395
+ ]
396
+
397
+ [[package]]
398
+ name = "hashbrown"
399
+ version = "0.15.4"
400
+ source = "registry+https://github.com/rust-lang/crates.io-index"
401
+ checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5"
402
+
403
+ [[package]]
404
+ name = "http"
405
+ version = "1.3.1"
406
+ source = "registry+https://github.com/rust-lang/crates.io-index"
407
+ checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565"
408
+ dependencies = [
409
+ "bytes",
410
+ "fnv",
411
+ "itoa",
412
+ ]
413
+
414
+ [[package]]
415
+ name = "http-body"
416
+ version = "1.0.1"
417
+ source = "registry+https://github.com/rust-lang/crates.io-index"
418
+ checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184"
419
+ dependencies = [
420
+ "bytes",
421
+ "http",
422
+ ]
423
+
424
+ [[package]]
425
+ name = "http-body-util"
426
+ version = "0.1.3"
427
+ source = "registry+https://github.com/rust-lang/crates.io-index"
428
+ checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a"
429
+ dependencies = [
430
+ "bytes",
431
+ "futures-core",
432
+ "http",
433
+ "http-body",
434
+ "pin-project-lite",
435
+ ]
436
+
437
+ [[package]]
438
+ name = "httparse"
439
+ version = "1.10.1"
440
+ source = "registry+https://github.com/rust-lang/crates.io-index"
441
+ checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87"
442
+
443
+ [[package]]
444
+ name = "hyper"
445
+ version = "1.6.0"
446
+ source = "registry+https://github.com/rust-lang/crates.io-index"
447
+ checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80"
448
+ dependencies = [
449
+ "bytes",
450
+ "futures-channel",
451
+ "futures-util",
452
+ "h2",
453
+ "http",
454
+ "http-body",
455
+ "httparse",
456
+ "itoa",
457
+ "pin-project-lite",
458
+ "smallvec",
459
+ "tokio",
460
+ "want",
461
+ ]
462
+
463
+ [[package]]
464
+ name = "hyper-rustls"
465
+ version = "0.27.7"
466
+ source = "registry+https://github.com/rust-lang/crates.io-index"
467
+ checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58"
468
+ dependencies = [
469
+ "http",
470
+ "hyper",
471
+ "hyper-util",
472
+ "rustls",
473
+ "rustls-pki-types",
474
+ "tokio",
475
+ "tokio-rustls",
476
+ "tower-service",
477
+ ]
478
+
479
+ [[package]]
480
+ name = "hyper-tls"
481
+ version = "0.6.0"
482
+ source = "registry+https://github.com/rust-lang/crates.io-index"
483
+ checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0"
484
+ dependencies = [
485
+ "bytes",
486
+ "http-body-util",
487
+ "hyper",
488
+ "hyper-util",
489
+ "native-tls",
490
+ "tokio",
491
+ "tokio-native-tls",
492
+ "tower-service",
493
+ ]
494
+
495
+ [[package]]
496
+ name = "hyper-util"
497
+ version = "0.1.16"
498
+ source = "registry+https://github.com/rust-lang/crates.io-index"
499
+ checksum = "8d9b05277c7e8da2c93a568989bb6207bef0112e8d17df7a6eda4a3cf143bc5e"
500
+ dependencies = [
501
+ "base64",
502
+ "bytes",
503
+ "futures-channel",
504
+ "futures-core",
505
+ "futures-util",
506
+ "http",
507
+ "http-body",
508
+ "hyper",
509
+ "ipnet",
510
+ "libc",
511
+ "percent-encoding",
512
+ "pin-project-lite",
513
+ "socket2",
514
+ "system-configuration",
515
+ "tokio",
516
+ "tower-service",
517
+ "tracing",
518
+ "windows-registry",
519
+ ]
520
+
521
+ [[package]]
522
+ name = "iana-time-zone"
523
+ version = "0.1.63"
524
+ source = "registry+https://github.com/rust-lang/crates.io-index"
525
+ checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8"
526
+ dependencies = [
527
+ "android_system_properties",
528
+ "core-foundation-sys",
529
+ "iana-time-zone-haiku",
530
+ "js-sys",
531
+ "log",
532
+ "wasm-bindgen",
533
+ "windows-core",
534
+ ]
535
+
536
+ [[package]]
537
+ name = "iana-time-zone-haiku"
538
+ version = "0.1.2"
539
+ source = "registry+https://github.com/rust-lang/crates.io-index"
540
+ checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f"
541
+ dependencies = [
542
+ "cc",
543
+ ]
544
+
545
+ [[package]]
546
+ name = "icu_collections"
547
+ version = "2.0.0"
548
+ source = "registry+https://github.com/rust-lang/crates.io-index"
549
+ checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47"
550
+ dependencies = [
551
+ "displaydoc",
552
+ "potential_utf",
553
+ "yoke",
554
+ "zerofrom",
555
+ "zerovec",
556
+ ]
557
+
558
+ [[package]]
559
+ name = "icu_locale_core"
560
+ version = "2.0.0"
561
+ source = "registry+https://github.com/rust-lang/crates.io-index"
562
+ checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a"
563
+ dependencies = [
564
+ "displaydoc",
565
+ "litemap",
566
+ "tinystr",
567
+ "writeable",
568
+ "zerovec",
569
+ ]
570
+
571
+ [[package]]
572
+ name = "icu_normalizer"
573
+ version = "2.0.0"
574
+ source = "registry+https://github.com/rust-lang/crates.io-index"
575
+ checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979"
576
+ dependencies = [
577
+ "displaydoc",
578
+ "icu_collections",
579
+ "icu_normalizer_data",
580
+ "icu_properties",
581
+ "icu_provider",
582
+ "smallvec",
583
+ "zerovec",
584
+ ]
585
+
586
+ [[package]]
587
+ name = "icu_normalizer_data"
588
+ version = "2.0.0"
589
+ source = "registry+https://github.com/rust-lang/crates.io-index"
590
+ checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3"
591
+
592
+ [[package]]
593
+ name = "icu_properties"
594
+ version = "2.0.1"
595
+ source = "registry+https://github.com/rust-lang/crates.io-index"
596
+ checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b"
597
+ dependencies = [
598
+ "displaydoc",
599
+ "icu_collections",
600
+ "icu_locale_core",
601
+ "icu_properties_data",
602
+ "icu_provider",
603
+ "potential_utf",
604
+ "zerotrie",
605
+ "zerovec",
606
+ ]
607
+
608
+ [[package]]
609
+ name = "icu_properties_data"
610
+ version = "2.0.1"
611
+ source = "registry+https://github.com/rust-lang/crates.io-index"
612
+ checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632"
613
+
614
+ [[package]]
615
+ name = "icu_provider"
616
+ version = "2.0.0"
617
+ source = "registry+https://github.com/rust-lang/crates.io-index"
618
+ checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af"
619
+ dependencies = [
620
+ "displaydoc",
621
+ "icu_locale_core",
622
+ "stable_deref_trait",
623
+ "tinystr",
624
+ "writeable",
625
+ "yoke",
626
+ "zerofrom",
627
+ "zerotrie",
628
+ "zerovec",
629
+ ]
630
+
631
+ [[package]]
632
+ name = "ident_case"
633
+ version = "1.0.1"
634
+ source = "registry+https://github.com/rust-lang/crates.io-index"
635
+ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39"
636
+
637
+ [[package]]
638
+ name = "idna"
639
+ version = "1.0.3"
640
+ source = "registry+https://github.com/rust-lang/crates.io-index"
641
+ checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e"
642
+ dependencies = [
643
+ "idna_adapter",
644
+ "smallvec",
645
+ "utf8_iter",
646
+ ]
647
+
648
+ [[package]]
649
+ name = "idna_adapter"
650
+ version = "1.2.1"
651
+ source = "registry+https://github.com/rust-lang/crates.io-index"
652
+ checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344"
653
+ dependencies = [
654
+ "icu_normalizer",
655
+ "icu_properties",
656
+ ]
657
+
658
+ [[package]]
659
+ name = "indexmap"
660
+ version = "2.10.0"
661
+ source = "registry+https://github.com/rust-lang/crates.io-index"
662
+ checksum = "fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661"
663
+ dependencies = [
664
+ "equivalent",
665
+ "hashbrown",
666
+ ]
667
+
668
+ [[package]]
669
+ name = "io-uring"
670
+ version = "0.7.9"
671
+ source = "registry+https://github.com/rust-lang/crates.io-index"
672
+ checksum = "d93587f37623a1a17d94ef2bc9ada592f5465fe7732084ab7beefabe5c77c0c4"
673
+ dependencies = [
674
+ "bitflags",
675
+ "cfg-if",
676
+ "libc",
677
+ ]
678
+
679
+ [[package]]
680
+ name = "ipnet"
681
+ version = "2.11.0"
682
+ source = "registry+https://github.com/rust-lang/crates.io-index"
683
+ checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130"
684
+
685
+ [[package]]
686
+ name = "iri-string"
687
+ version = "0.7.8"
688
+ source = "registry+https://github.com/rust-lang/crates.io-index"
689
+ checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2"
690
+ dependencies = [
691
+ "memchr",
692
+ "serde",
693
+ ]
694
+
695
+ [[package]]
696
+ name = "itoa"
697
+ version = "1.0.15"
698
+ source = "registry+https://github.com/rust-lang/crates.io-index"
699
+ checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c"
700
+
701
+ [[package]]
702
+ name = "js-sys"
703
+ version = "0.3.77"
704
+ source = "registry+https://github.com/rust-lang/crates.io-index"
705
+ checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f"
706
+ dependencies = [
707
+ "once_cell",
708
+ "wasm-bindgen",
709
+ ]
710
+
711
+ [[package]]
712
+ name = "lazy_static"
713
+ version = "1.5.0"
714
+ source = "registry+https://github.com/rust-lang/crates.io-index"
715
+ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
716
+
717
+ [[package]]
718
+ name = "libc"
719
+ version = "0.2.174"
720
+ source = "registry+https://github.com/rust-lang/crates.io-index"
721
+ checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776"
722
+
723
+ [[package]]
724
+ name = "linux-raw-sys"
725
+ version = "0.9.4"
726
+ source = "registry+https://github.com/rust-lang/crates.io-index"
727
+ checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12"
728
+
729
+ [[package]]
730
+ name = "litemap"
731
+ version = "0.8.0"
732
+ source = "registry+https://github.com/rust-lang/crates.io-index"
733
+ checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956"
734
+
735
+ [[package]]
736
+ name = "lock_api"
737
+ version = "0.4.13"
738
+ source = "registry+https://github.com/rust-lang/crates.io-index"
739
+ checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765"
740
+ dependencies = [
741
+ "autocfg",
742
+ "scopeguard",
743
+ ]
744
+
745
+ [[package]]
746
+ name = "log"
747
+ version = "0.4.27"
748
+ source = "registry+https://github.com/rust-lang/crates.io-index"
749
+ checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94"
750
+
751
+ [[package]]
752
+ name = "matchers"
753
+ version = "0.2.0"
754
+ source = "registry+https://github.com/rust-lang/crates.io-index"
755
+ checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9"
756
+ dependencies = [
757
+ "regex-automata",
758
+ ]
759
+
760
+ [[package]]
761
+ name = "memchr"
762
+ version = "2.7.5"
763
+ source = "registry+https://github.com/rust-lang/crates.io-index"
764
+ checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0"
765
+
766
+ [[package]]
767
+ name = "mime"
768
+ version = "0.3.17"
769
+ source = "registry+https://github.com/rust-lang/crates.io-index"
770
+ checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
771
+
772
+ [[package]]
773
+ name = "miniz_oxide"
774
+ version = "0.8.9"
775
+ source = "registry+https://github.com/rust-lang/crates.io-index"
776
+ checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316"
777
+ dependencies = [
778
+ "adler2",
779
+ ]
780
+
781
+ [[package]]
782
+ name = "mio"
783
+ version = "1.0.4"
784
+ source = "registry+https://github.com/rust-lang/crates.io-index"
785
+ checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c"
786
+ dependencies = [
787
+ "libc",
788
+ "wasi 0.11.1+wasi-snapshot-preview1",
789
+ "windows-sys 0.59.0",
790
+ ]
791
+
792
+ [[package]]
793
+ name = "native-tls"
794
+ version = "0.2.14"
795
+ source = "registry+https://github.com/rust-lang/crates.io-index"
796
+ checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e"
797
+ dependencies = [
798
+ "libc",
799
+ "log",
800
+ "openssl",
801
+ "openssl-probe",
802
+ "openssl-sys",
803
+ "schannel",
804
+ "security-framework",
805
+ "security-framework-sys",
806
+ "tempfile",
807
+ ]
808
+
809
+ [[package]]
810
+ name = "nu-ansi-term"
811
+ version = "0.50.3"
812
+ source = "registry+https://github.com/rust-lang/crates.io-index"
813
+ checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5"
814
+ dependencies = [
815
+ "windows-sys 0.60.2",
816
+ ]
817
+
818
+ [[package]]
819
+ name = "num-traits"
820
+ version = "0.2.19"
821
+ source = "registry+https://github.com/rust-lang/crates.io-index"
822
+ checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
823
+ dependencies = [
824
+ "autocfg",
825
+ ]
826
+
827
+ [[package]]
828
+ name = "object"
829
+ version = "0.36.7"
830
+ source = "registry+https://github.com/rust-lang/crates.io-index"
831
+ checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87"
832
+ dependencies = [
833
+ "memchr",
834
+ ]
835
+
836
+ [[package]]
837
+ name = "once_cell"
838
+ version = "1.21.3"
839
+ source = "registry+https://github.com/rust-lang/crates.io-index"
840
+ checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d"
841
+
842
+ [[package]]
843
+ name = "openssl"
844
+ version = "0.10.73"
845
+ source = "registry+https://github.com/rust-lang/crates.io-index"
846
+ checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8"
847
+ dependencies = [
848
+ "bitflags",
849
+ "cfg-if",
850
+ "foreign-types",
851
+ "libc",
852
+ "once_cell",
853
+ "openssl-macros",
854
+ "openssl-sys",
855
+ ]
856
+
857
+ [[package]]
858
+ name = "openssl-macros"
859
+ version = "0.1.1"
860
+ source = "registry+https://github.com/rust-lang/crates.io-index"
861
+ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c"
862
+ dependencies = [
863
+ "proc-macro2",
864
+ "quote",
865
+ "syn",
866
+ ]
867
+
868
+ [[package]]
869
+ name = "openssl-probe"
870
+ version = "0.1.6"
871
+ source = "registry+https://github.com/rust-lang/crates.io-index"
872
+ checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e"
873
+
874
+ [[package]]
875
+ name = "openssl-sys"
876
+ version = "0.9.109"
877
+ source = "registry+https://github.com/rust-lang/crates.io-index"
878
+ checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571"
879
+ dependencies = [
880
+ "cc",
881
+ "libc",
882
+ "pkg-config",
883
+ "vcpkg",
884
+ ]
885
+
886
+ [[package]]
887
+ name = "parking_lot"
888
+ version = "0.12.4"
889
+ source = "registry+https://github.com/rust-lang/crates.io-index"
890
+ checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13"
891
+ dependencies = [
892
+ "lock_api",
893
+ "parking_lot_core",
894
+ ]
895
+
896
+ [[package]]
897
+ name = "parking_lot_core"
898
+ version = "0.9.11"
899
+ source = "registry+https://github.com/rust-lang/crates.io-index"
900
+ checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5"
901
+ dependencies = [
902
+ "cfg-if",
903
+ "libc",
904
+ "redox_syscall",
905
+ "smallvec",
906
+ "windows-targets 0.52.6",
907
+ ]
908
+
909
+ [[package]]
910
+ name = "paste"
911
+ version = "1.0.15"
912
+ source = "registry+https://github.com/rust-lang/crates.io-index"
913
+ checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a"
914
+
915
+ [[package]]
916
+ name = "percent-encoding"
917
+ version = "2.3.1"
918
+ source = "registry+https://github.com/rust-lang/crates.io-index"
919
+ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e"
920
+
921
+ [[package]]
922
+ name = "pin-project-lite"
923
+ version = "0.2.16"
924
+ source = "registry+https://github.com/rust-lang/crates.io-index"
925
+ checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b"
926
+
927
+ [[package]]
928
+ name = "pin-utils"
929
+ version = "0.1.0"
930
+ source = "registry+https://github.com/rust-lang/crates.io-index"
931
+ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
932
+
933
+ [[package]]
934
+ name = "pkg-config"
935
+ version = "0.3.32"
936
+ source = "registry+https://github.com/rust-lang/crates.io-index"
937
+ checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c"
938
+
939
+ [[package]]
940
+ name = "potential_utf"
941
+ version = "0.1.2"
942
+ source = "registry+https://github.com/rust-lang/crates.io-index"
943
+ checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585"
944
+ dependencies = [
945
+ "zerovec",
946
+ ]
947
+
948
+ [[package]]
949
+ name = "proc-macro2"
950
+ version = "1.0.95"
951
+ source = "registry+https://github.com/rust-lang/crates.io-index"
952
+ checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778"
953
+ dependencies = [
954
+ "unicode-ident",
955
+ ]
956
+
957
+ [[package]]
958
+ name = "quote"
959
+ version = "1.0.40"
960
+ source = "registry+https://github.com/rust-lang/crates.io-index"
961
+ checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d"
962
+ dependencies = [
963
+ "proc-macro2",
964
+ ]
965
+
966
+ [[package]]
967
+ name = "r-efi"
968
+ version = "5.3.0"
969
+ source = "registry+https://github.com/rust-lang/crates.io-index"
970
+ checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f"
971
+
972
+ [[package]]
973
+ name = "redox_syscall"
974
+ version = "0.5.15"
975
+ source = "registry+https://github.com/rust-lang/crates.io-index"
976
+ checksum = "7e8af0dde094006011e6a740d4879319439489813bd0bcdc7d821beaeeff48ec"
977
+ dependencies = [
978
+ "bitflags",
979
+ ]
980
+
981
+ [[package]]
982
+ name = "ref-cast"
983
+ version = "1.0.24"
984
+ source = "registry+https://github.com/rust-lang/crates.io-index"
985
+ checksum = "4a0ae411dbe946a674d89546582cea4ba2bb8defac896622d6496f14c23ba5cf"
986
+ dependencies = [
987
+ "ref-cast-impl",
988
+ ]
989
+
990
+ [[package]]
991
+ name = "ref-cast-impl"
992
+ version = "1.0.24"
993
+ source = "registry+https://github.com/rust-lang/crates.io-index"
994
+ checksum = "1165225c21bff1f3bbce98f5a1f889949bc902d3575308cc7b0de30b4f6d27c7"
995
+ dependencies = [
996
+ "proc-macro2",
997
+ "quote",
998
+ "syn",
999
+ ]
1000
+
1001
+ [[package]]
1002
+ name = "regex-automata"
1003
+ version = "0.4.9"
1004
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1005
+ checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908"
1006
+ dependencies = [
1007
+ "aho-corasick",
1008
+ "memchr",
1009
+ "regex-syntax",
1010
+ ]
1011
+
1012
+ [[package]]
1013
+ name = "regex-syntax"
1014
+ version = "0.8.5"
1015
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1016
+ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c"
1017
+
1018
+ [[package]]
1019
+ name = "reqwest"
1020
+ version = "0.12.22"
1021
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1022
+ checksum = "cbc931937e6ca3a06e3b6c0aa7841849b160a90351d6ab467a8b9b9959767531"
1023
+ dependencies = [
1024
+ "base64",
1025
+ "bytes",
1026
+ "encoding_rs",
1027
+ "futures-core",
1028
+ "h2",
1029
+ "http",
1030
+ "http-body",
1031
+ "http-body-util",
1032
+ "hyper",
1033
+ "hyper-rustls",
1034
+ "hyper-tls",
1035
+ "hyper-util",
1036
+ "js-sys",
1037
+ "log",
1038
+ "mime",
1039
+ "native-tls",
1040
+ "percent-encoding",
1041
+ "pin-project-lite",
1042
+ "rustls-pki-types",
1043
+ "serde",
1044
+ "serde_json",
1045
+ "serde_urlencoded",
1046
+ "sync_wrapper",
1047
+ "tokio",
1048
+ "tokio-native-tls",
1049
+ "tower",
1050
+ "tower-http",
1051
+ "tower-service",
1052
+ "url",
1053
+ "wasm-bindgen",
1054
+ "wasm-bindgen-futures",
1055
+ "web-sys",
1056
+ ]
1057
+
1058
+ [[package]]
1059
+ name = "ring"
1060
+ version = "0.17.14"
1061
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1062
+ checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7"
1063
+ dependencies = [
1064
+ "cc",
1065
+ "cfg-if",
1066
+ "getrandom 0.2.16",
1067
+ "libc",
1068
+ "untrusted",
1069
+ "windows-sys 0.52.0",
1070
+ ]
1071
+
1072
+ [[package]]
1073
+ name = "rmcp"
1074
+ version = "0.3.0"
1075
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1076
+ checksum = "b008b927a85d514699ff304be84c5084598596e6cad4a6f5bc67207715fafe5f"
1077
+ dependencies = [
1078
+ "base64",
1079
+ "chrono",
1080
+ "futures",
1081
+ "paste",
1082
+ "pin-project-lite",
1083
+ "rmcp-macros",
1084
+ "schemars",
1085
+ "serde",
1086
+ "serde_json",
1087
+ "thiserror",
1088
+ "tokio",
1089
+ "tokio-util",
1090
+ "tracing",
1091
+ ]
1092
+
1093
+ [[package]]
1094
+ name = "rmcp-macros"
1095
+ version = "0.3.0"
1096
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1097
+ checksum = "7465280d5f73f2c5c99017a04af407b2262455a149f255ad22f2b0b29087695c"
1098
+ dependencies = [
1099
+ "darling",
1100
+ "proc-macro2",
1101
+ "quote",
1102
+ "serde_json",
1103
+ "syn",
1104
+ ]
1105
+
1106
+ [[package]]
1107
+ name = "rustc-demangle"
1108
+ version = "0.1.25"
1109
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1110
+ checksum = "989e6739f80c4ad5b13e0fd7fe89531180375b18520cc8c82080e4dc4035b84f"
1111
+
1112
+ [[package]]
1113
+ name = "rustix"
1114
+ version = "1.0.8"
1115
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1116
+ checksum = "11181fbabf243db407ef8df94a6ce0b2f9a733bd8be4ad02b4eda9602296cac8"
1117
+ dependencies = [
1118
+ "bitflags",
1119
+ "errno",
1120
+ "libc",
1121
+ "linux-raw-sys",
1122
+ "windows-sys 0.60.2",
1123
+ ]
1124
+
1125
+ [[package]]
1126
+ name = "rustls"
1127
+ version = "0.23.29"
1128
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1129
+ checksum = "2491382039b29b9b11ff08b76ff6c97cf287671dbb74f0be44bda389fffe9bd1"
1130
+ dependencies = [
1131
+ "once_cell",
1132
+ "rustls-pki-types",
1133
+ "rustls-webpki",
1134
+ "subtle",
1135
+ "zeroize",
1136
+ ]
1137
+
1138
+ [[package]]
1139
+ name = "rustls-pki-types"
1140
+ version = "1.12.0"
1141
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1142
+ checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79"
1143
+ dependencies = [
1144
+ "zeroize",
1145
+ ]
1146
+
1147
+ [[package]]
1148
+ name = "rustls-webpki"
1149
+ version = "0.103.4"
1150
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1151
+ checksum = "0a17884ae0c1b773f1ccd2bd4a8c72f16da897310a98b0e84bf349ad5ead92fc"
1152
+ dependencies = [
1153
+ "ring",
1154
+ "rustls-pki-types",
1155
+ "untrusted",
1156
+ ]
1157
+
1158
+ [[package]]
1159
+ name = "rustversion"
1160
+ version = "1.0.21"
1161
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1162
+ checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d"
1163
+
1164
+ [[package]]
1165
+ name = "ryu"
1166
+ version = "1.0.20"
1167
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1168
+ checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f"
1169
+
1170
+ [[package]]
1171
+ name = "schannel"
1172
+ version = "0.1.27"
1173
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1174
+ checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d"
1175
+ dependencies = [
1176
+ "windows-sys 0.59.0",
1177
+ ]
1178
+
1179
+ [[package]]
1180
+ name = "schemars"
1181
+ version = "1.0.4"
1182
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1183
+ checksum = "82d20c4491bc164fa2f6c5d44565947a52ad80b9505d8e36f8d54c27c739fcd0"
1184
+ dependencies = [
1185
+ "chrono",
1186
+ "dyn-clone",
1187
+ "ref-cast",
1188
+ "schemars_derive",
1189
+ "serde",
1190
+ "serde_json",
1191
+ ]
1192
+
1193
+ [[package]]
1194
+ name = "schemars_derive"
1195
+ version = "1.0.4"
1196
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1197
+ checksum = "33d020396d1d138dc19f1165df7545479dcd58d93810dc5d646a16e55abefa80"
1198
+ dependencies = [
1199
+ "proc-macro2",
1200
+ "quote",
1201
+ "serde_derive_internals",
1202
+ "syn",
1203
+ ]
1204
+
1205
+ [[package]]
1206
+ name = "scopeguard"
1207
+ version = "1.2.0"
1208
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1209
+ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
1210
+
1211
+ [[package]]
1212
+ name = "security-framework"
1213
+ version = "2.11.1"
1214
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1215
+ checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02"
1216
+ dependencies = [
1217
+ "bitflags",
1218
+ "core-foundation",
1219
+ "core-foundation-sys",
1220
+ "libc",
1221
+ "security-framework-sys",
1222
+ ]
1223
+
1224
+ [[package]]
1225
+ name = "security-framework-sys"
1226
+ version = "2.14.0"
1227
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1228
+ checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32"
1229
+ dependencies = [
1230
+ "core-foundation-sys",
1231
+ "libc",
1232
+ ]
1233
+
1234
+ [[package]]
1235
+ name = "serde"
1236
+ version = "1.0.219"
1237
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1238
+ checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6"
1239
+ dependencies = [
1240
+ "serde_derive",
1241
+ ]
1242
+
1243
+ [[package]]
1244
+ name = "serde_derive"
1245
+ version = "1.0.219"
1246
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1247
+ checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00"
1248
+ dependencies = [
1249
+ "proc-macro2",
1250
+ "quote",
1251
+ "syn",
1252
+ ]
1253
+
1254
+ [[package]]
1255
+ name = "serde_derive_internals"
1256
+ version = "0.29.1"
1257
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1258
+ checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711"
1259
+ dependencies = [
1260
+ "proc-macro2",
1261
+ "quote",
1262
+ "syn",
1263
+ ]
1264
+
1265
+ [[package]]
1266
+ name = "serde_json"
1267
+ version = "1.0.141"
1268
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1269
+ checksum = "30b9eff21ebe718216c6ec64e1d9ac57087aad11efc64e32002bce4a0d4c03d3"
1270
+ dependencies = [
1271
+ "itoa",
1272
+ "memchr",
1273
+ "ryu",
1274
+ "serde",
1275
+ ]
1276
+
1277
+ [[package]]
1278
+ name = "serde_urlencoded"
1279
+ version = "0.7.1"
1280
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1281
+ checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd"
1282
+ dependencies = [
1283
+ "form_urlencoded",
1284
+ "itoa",
1285
+ "ryu",
1286
+ "serde",
1287
+ ]
1288
+
1289
+ [[package]]
1290
+ name = "sharded-slab"
1291
+ version = "0.1.7"
1292
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1293
+ checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6"
1294
+ dependencies = [
1295
+ "lazy_static",
1296
+ ]
1297
+
1298
+ [[package]]
1299
+ name = "shlex"
1300
+ version = "1.3.0"
1301
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1302
+ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
1303
+
1304
+ [[package]]
1305
+ name = "signal-hook-registry"
1306
+ version = "1.4.5"
1307
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1308
+ checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410"
1309
+ dependencies = [
1310
+ "libc",
1311
+ ]
1312
+
1313
+ [[package]]
1314
+ name = "slab"
1315
+ version = "0.4.11"
1316
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1317
+ checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589"
1318
+
1319
+ [[package]]
1320
+ name = "smallvec"
1321
+ version = "1.15.1"
1322
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1323
+ checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03"
1324
+
1325
+ [[package]]
1326
+ name = "socket2"
1327
+ version = "0.5.10"
1328
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1329
+ checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678"
1330
+ dependencies = [
1331
+ "libc",
1332
+ "windows-sys 0.52.0",
1333
+ ]
1334
+
1335
+ [[package]]
1336
+ name = "stable_deref_trait"
1337
+ version = "1.2.0"
1338
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1339
+ checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3"
1340
+
1341
+ [[package]]
1342
+ name = "strsim"
1343
+ version = "0.11.1"
1344
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1345
+ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
1346
+
1347
+ [[package]]
1348
+ name = "subtle"
1349
+ version = "2.6.1"
1350
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1351
+ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292"
1352
+
1353
+ [[package]]
1354
+ name = "syn"
1355
+ version = "2.0.104"
1356
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1357
+ checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40"
1358
+ dependencies = [
1359
+ "proc-macro2",
1360
+ "quote",
1361
+ "unicode-ident",
1362
+ ]
1363
+
1364
+ [[package]]
1365
+ name = "sync_wrapper"
1366
+ version = "1.0.2"
1367
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1368
+ checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263"
1369
+ dependencies = [
1370
+ "futures-core",
1371
+ ]
1372
+
1373
+ [[package]]
1374
+ name = "synstructure"
1375
+ version = "0.13.2"
1376
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1377
+ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2"
1378
+ dependencies = [
1379
+ "proc-macro2",
1380
+ "quote",
1381
+ "syn",
1382
+ ]
1383
+
1384
+ [[package]]
1385
+ name = "system-configuration"
1386
+ version = "0.6.1"
1387
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1388
+ checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b"
1389
+ dependencies = [
1390
+ "bitflags",
1391
+ "core-foundation",
1392
+ "system-configuration-sys",
1393
+ ]
1394
+
1395
+ [[package]]
1396
+ name = "system-configuration-sys"
1397
+ version = "0.6.0"
1398
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1399
+ checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4"
1400
+ dependencies = [
1401
+ "core-foundation-sys",
1402
+ "libc",
1403
+ ]
1404
+
1405
+ [[package]]
1406
+ name = "tempfile"
1407
+ version = "3.20.0"
1408
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1409
+ checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1"
1410
+ dependencies = [
1411
+ "fastrand",
1412
+ "getrandom 0.3.3",
1413
+ "once_cell",
1414
+ "rustix",
1415
+ "windows-sys 0.59.0",
1416
+ ]
1417
+
1418
+ [[package]]
1419
+ name = "thiserror"
1420
+ version = "2.0.12"
1421
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1422
+ checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708"
1423
+ dependencies = [
1424
+ "thiserror-impl",
1425
+ ]
1426
+
1427
+ [[package]]
1428
+ name = "thiserror-impl"
1429
+ version = "2.0.12"
1430
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1431
+ checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d"
1432
+ dependencies = [
1433
+ "proc-macro2",
1434
+ "quote",
1435
+ "syn",
1436
+ ]
1437
+
1438
+ [[package]]
1439
+ name = "thread_local"
1440
+ version = "1.1.9"
1441
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1442
+ checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185"
1443
+ dependencies = [
1444
+ "cfg-if",
1445
+ ]
1446
+
1447
+ [[package]]
1448
+ name = "tinystr"
1449
+ version = "0.8.1"
1450
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1451
+ checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b"
1452
+ dependencies = [
1453
+ "displaydoc",
1454
+ "zerovec",
1455
+ ]
1456
+
1457
+ [[package]]
1458
+ name = "tokio"
1459
+ version = "1.46.1"
1460
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1461
+ checksum = "0cc3a2344dafbe23a245241fe8b09735b521110d30fcefbbd5feb1797ca35d17"
1462
+ dependencies = [
1463
+ "backtrace",
1464
+ "bytes",
1465
+ "io-uring",
1466
+ "libc",
1467
+ "mio",
1468
+ "parking_lot",
1469
+ "pin-project-lite",
1470
+ "signal-hook-registry",
1471
+ "slab",
1472
+ "socket2",
1473
+ "tokio-macros",
1474
+ "windows-sys 0.52.0",
1475
+ ]
1476
+
1477
+ [[package]]
1478
+ name = "tokio-macros"
1479
+ version = "2.5.0"
1480
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1481
+ checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8"
1482
+ dependencies = [
1483
+ "proc-macro2",
1484
+ "quote",
1485
+ "syn",
1486
+ ]
1487
+
1488
+ [[package]]
1489
+ name = "tokio-native-tls"
1490
+ version = "0.3.1"
1491
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1492
+ checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2"
1493
+ dependencies = [
1494
+ "native-tls",
1495
+ "tokio",
1496
+ ]
1497
+
1498
+ [[package]]
1499
+ name = "tokio-rustls"
1500
+ version = "0.26.2"
1501
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1502
+ checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b"
1503
+ dependencies = [
1504
+ "rustls",
1505
+ "tokio",
1506
+ ]
1507
+
1508
+ [[package]]
1509
+ name = "tokio-util"
1510
+ version = "0.7.15"
1511
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1512
+ checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df"
1513
+ dependencies = [
1514
+ "bytes",
1515
+ "futures-core",
1516
+ "futures-sink",
1517
+ "pin-project-lite",
1518
+ "tokio",
1519
+ ]
1520
+
1521
+ [[package]]
1522
+ name = "tower"
1523
+ version = "0.5.2"
1524
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1525
+ checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9"
1526
+ dependencies = [
1527
+ "futures-core",
1528
+ "futures-util",
1529
+ "pin-project-lite",
1530
+ "sync_wrapper",
1531
+ "tokio",
1532
+ "tower-layer",
1533
+ "tower-service",
1534
+ ]
1535
+
1536
+ [[package]]
1537
+ name = "tower-http"
1538
+ version = "0.6.6"
1539
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1540
+ checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2"
1541
+ dependencies = [
1542
+ "bitflags",
1543
+ "bytes",
1544
+ "futures-util",
1545
+ "http",
1546
+ "http-body",
1547
+ "iri-string",
1548
+ "pin-project-lite",
1549
+ "tower",
1550
+ "tower-layer",
1551
+ "tower-service",
1552
+ ]
1553
+
1554
+ [[package]]
1555
+ name = "tower-layer"
1556
+ version = "0.3.3"
1557
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1558
+ checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e"
1559
+
1560
+ [[package]]
1561
+ name = "tower-service"
1562
+ version = "0.3.3"
1563
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1564
+ checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3"
1565
+
1566
+ [[package]]
1567
+ name = "tracing"
1568
+ version = "0.1.41"
1569
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1570
+ checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0"
1571
+ dependencies = [
1572
+ "pin-project-lite",
1573
+ "tracing-attributes",
1574
+ "tracing-core",
1575
+ ]
1576
+
1577
+ [[package]]
1578
+ name = "tracing-attributes"
1579
+ version = "0.1.30"
1580
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1581
+ checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903"
1582
+ dependencies = [
1583
+ "proc-macro2",
1584
+ "quote",
1585
+ "syn",
1586
+ ]
1587
+
1588
+ [[package]]
1589
+ name = "tracing-core"
1590
+ version = "0.1.34"
1591
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1592
+ checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678"
1593
+ dependencies = [
1594
+ "once_cell",
1595
+ "valuable",
1596
+ ]
1597
+
1598
+ [[package]]
1599
+ name = "tracing-log"
1600
+ version = "0.2.0"
1601
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1602
+ checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3"
1603
+ dependencies = [
1604
+ "log",
1605
+ "once_cell",
1606
+ "tracing-core",
1607
+ ]
1608
+
1609
+ [[package]]
1610
+ name = "tracing-subscriber"
1611
+ version = "0.3.20"
1612
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1613
+ checksum = "2054a14f5307d601f88daf0553e1cbf472acc4f2c51afab632431cdcd72124d5"
1614
+ dependencies = [
1615
+ "matchers",
1616
+ "nu-ansi-term",
1617
+ "once_cell",
1618
+ "regex-automata",
1619
+ "sharded-slab",
1620
+ "smallvec",
1621
+ "thread_local",
1622
+ "tracing",
1623
+ "tracing-core",
1624
+ "tracing-log",
1625
+ ]
1626
+
1627
+ [[package]]
1628
+ name = "try-lock"
1629
+ version = "0.2.5"
1630
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1631
+ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b"
1632
+
1633
+ [[package]]
1634
+ name = "unicode-ident"
1635
+ version = "1.0.18"
1636
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1637
+ checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512"
1638
+
1639
+ [[package]]
1640
+ name = "untrusted"
1641
+ version = "0.9.0"
1642
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1643
+ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1"
1644
+
1645
+ [[package]]
1646
+ name = "url"
1647
+ version = "2.5.4"
1648
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1649
+ checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60"
1650
+ dependencies = [
1651
+ "form_urlencoded",
1652
+ "idna",
1653
+ "percent-encoding",
1654
+ ]
1655
+
1656
+ [[package]]
1657
+ name = "utf8_iter"
1658
+ version = "1.0.4"
1659
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1660
+ checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be"
1661
+
1662
+ [[package]]
1663
+ name = "valuable"
1664
+ version = "0.1.1"
1665
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1666
+ checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65"
1667
+
1668
+ [[package]]
1669
+ name = "vcpkg"
1670
+ version = "0.2.15"
1671
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1672
+ checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426"
1673
+
1674
+ [[package]]
1675
+ name = "want"
1676
+ version = "0.3.1"
1677
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1678
+ checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e"
1679
+ dependencies = [
1680
+ "try-lock",
1681
+ ]
1682
+
1683
+ [[package]]
1684
+ name = "wasi"
1685
+ version = "0.11.1+wasi-snapshot-preview1"
1686
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1687
+ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b"
1688
+
1689
+ [[package]]
1690
+ name = "wasi"
1691
+ version = "0.14.2+wasi-0.2.4"
1692
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1693
+ checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3"
1694
+ dependencies = [
1695
+ "wit-bindgen-rt",
1696
+ ]
1697
+
1698
+ [[package]]
1699
+ name = "wasm-bindgen"
1700
+ version = "0.2.100"
1701
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1702
+ checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5"
1703
+ dependencies = [
1704
+ "cfg-if",
1705
+ "once_cell",
1706
+ "rustversion",
1707
+ "wasm-bindgen-macro",
1708
+ ]
1709
+
1710
+ [[package]]
1711
+ name = "wasm-bindgen-backend"
1712
+ version = "0.2.100"
1713
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1714
+ checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6"
1715
+ dependencies = [
1716
+ "bumpalo",
1717
+ "log",
1718
+ "proc-macro2",
1719
+ "quote",
1720
+ "syn",
1721
+ "wasm-bindgen-shared",
1722
+ ]
1723
+
1724
+ [[package]]
1725
+ name = "wasm-bindgen-futures"
1726
+ version = "0.4.50"
1727
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1728
+ checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61"
1729
+ dependencies = [
1730
+ "cfg-if",
1731
+ "js-sys",
1732
+ "once_cell",
1733
+ "wasm-bindgen",
1734
+ "web-sys",
1735
+ ]
1736
+
1737
+ [[package]]
1738
+ name = "wasm-bindgen-macro"
1739
+ version = "0.2.100"
1740
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1741
+ checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407"
1742
+ dependencies = [
1743
+ "quote",
1744
+ "wasm-bindgen-macro-support",
1745
+ ]
1746
+
1747
+ [[package]]
1748
+ name = "wasm-bindgen-macro-support"
1749
+ version = "0.2.100"
1750
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1751
+ checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de"
1752
+ dependencies = [
1753
+ "proc-macro2",
1754
+ "quote",
1755
+ "syn",
1756
+ "wasm-bindgen-backend",
1757
+ "wasm-bindgen-shared",
1758
+ ]
1759
+
1760
+ [[package]]
1761
+ name = "wasm-bindgen-shared"
1762
+ version = "0.2.100"
1763
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1764
+ checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d"
1765
+ dependencies = [
1766
+ "unicode-ident",
1767
+ ]
1768
+
1769
+ [[package]]
1770
+ name = "weather"
1771
+ version = "0.1.0"
1772
+ dependencies = [
1773
+ "anyhow",
1774
+ "reqwest",
1775
+ "rmcp",
1776
+ "serde",
1777
+ "serde_json",
1778
+ "tokio",
1779
+ "tracing",
1780
+ "tracing-subscriber",
1781
+ ]
1782
+
1783
+ [[package]]
1784
+ name = "web-sys"
1785
+ version = "0.3.77"
1786
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1787
+ checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2"
1788
+ dependencies = [
1789
+ "js-sys",
1790
+ "wasm-bindgen",
1791
+ ]
1792
+
1793
+ [[package]]
1794
+ name = "windows-core"
1795
+ version = "0.61.2"
1796
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1797
+ checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3"
1798
+ dependencies = [
1799
+ "windows-implement",
1800
+ "windows-interface",
1801
+ "windows-link",
1802
+ "windows-result",
1803
+ "windows-strings",
1804
+ ]
1805
+
1806
+ [[package]]
1807
+ name = "windows-implement"
1808
+ version = "0.60.0"
1809
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1810
+ checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836"
1811
+ dependencies = [
1812
+ "proc-macro2",
1813
+ "quote",
1814
+ "syn",
1815
+ ]
1816
+
1817
+ [[package]]
1818
+ name = "windows-interface"
1819
+ version = "0.59.1"
1820
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1821
+ checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8"
1822
+ dependencies = [
1823
+ "proc-macro2",
1824
+ "quote",
1825
+ "syn",
1826
+ ]
1827
+
1828
+ [[package]]
1829
+ name = "windows-link"
1830
+ version = "0.1.3"
1831
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1832
+ checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a"
1833
+
1834
+ [[package]]
1835
+ name = "windows-registry"
1836
+ version = "0.5.3"
1837
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1838
+ checksum = "5b8a9ed28765efc97bbc954883f4e6796c33a06546ebafacbabee9696967499e"
1839
+ dependencies = [
1840
+ "windows-link",
1841
+ "windows-result",
1842
+ "windows-strings",
1843
+ ]
1844
+
1845
+ [[package]]
1846
+ name = "windows-result"
1847
+ version = "0.3.4"
1848
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1849
+ checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6"
1850
+ dependencies = [
1851
+ "windows-link",
1852
+ ]
1853
+
1854
+ [[package]]
1855
+ name = "windows-strings"
1856
+ version = "0.4.2"
1857
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1858
+ checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57"
1859
+ dependencies = [
1860
+ "windows-link",
1861
+ ]
1862
+
1863
+ [[package]]
1864
+ name = "windows-sys"
1865
+ version = "0.52.0"
1866
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1867
+ checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
1868
+ dependencies = [
1869
+ "windows-targets 0.52.6",
1870
+ ]
1871
+
1872
+ [[package]]
1873
+ name = "windows-sys"
1874
+ version = "0.59.0"
1875
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1876
+ checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b"
1877
+ dependencies = [
1878
+ "windows-targets 0.52.6",
1879
+ ]
1880
+
1881
+ [[package]]
1882
+ name = "windows-sys"
1883
+ version = "0.60.2"
1884
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1885
+ checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb"
1886
+ dependencies = [
1887
+ "windows-targets 0.53.2",
1888
+ ]
1889
+
1890
+ [[package]]
1891
+ name = "windows-targets"
1892
+ version = "0.52.6"
1893
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1894
+ checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
1895
+ dependencies = [
1896
+ "windows_aarch64_gnullvm 0.52.6",
1897
+ "windows_aarch64_msvc 0.52.6",
1898
+ "windows_i686_gnu 0.52.6",
1899
+ "windows_i686_gnullvm 0.52.6",
1900
+ "windows_i686_msvc 0.52.6",
1901
+ "windows_x86_64_gnu 0.52.6",
1902
+ "windows_x86_64_gnullvm 0.52.6",
1903
+ "windows_x86_64_msvc 0.52.6",
1904
+ ]
1905
+
1906
+ [[package]]
1907
+ name = "windows-targets"
1908
+ version = "0.53.2"
1909
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1910
+ checksum = "c66f69fcc9ce11da9966ddb31a40968cad001c5bedeb5c2b82ede4253ab48aef"
1911
+ dependencies = [
1912
+ "windows_aarch64_gnullvm 0.53.0",
1913
+ "windows_aarch64_msvc 0.53.0",
1914
+ "windows_i686_gnu 0.53.0",
1915
+ "windows_i686_gnullvm 0.53.0",
1916
+ "windows_i686_msvc 0.53.0",
1917
+ "windows_x86_64_gnu 0.53.0",
1918
+ "windows_x86_64_gnullvm 0.53.0",
1919
+ "windows_x86_64_msvc 0.53.0",
1920
+ ]
1921
+
1922
+ [[package]]
1923
+ name = "windows_aarch64_gnullvm"
1924
+ version = "0.52.6"
1925
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1926
+ checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
1927
+
1928
+ [[package]]
1929
+ name = "windows_aarch64_gnullvm"
1930
+ version = "0.53.0"
1931
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1932
+ checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764"
1933
+
1934
+ [[package]]
1935
+ name = "windows_aarch64_msvc"
1936
+ version = "0.52.6"
1937
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1938
+ checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
1939
+
1940
+ [[package]]
1941
+ name = "windows_aarch64_msvc"
1942
+ version = "0.53.0"
1943
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1944
+ checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c"
1945
+
1946
+ [[package]]
1947
+ name = "windows_i686_gnu"
1948
+ version = "0.52.6"
1949
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1950
+ checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
1951
+
1952
+ [[package]]
1953
+ name = "windows_i686_gnu"
1954
+ version = "0.53.0"
1955
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1956
+ checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3"
1957
+
1958
+ [[package]]
1959
+ name = "windows_i686_gnullvm"
1960
+ version = "0.52.6"
1961
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1962
+ checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
1963
+
1964
+ [[package]]
1965
+ name = "windows_i686_gnullvm"
1966
+ version = "0.53.0"
1967
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1968
+ checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11"
1969
+
1970
+ [[package]]
1971
+ name = "windows_i686_msvc"
1972
+ version = "0.52.6"
1973
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1974
+ checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
1975
+
1976
+ [[package]]
1977
+ name = "windows_i686_msvc"
1978
+ version = "0.53.0"
1979
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1980
+ checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d"
1981
+
1982
+ [[package]]
1983
+ name = "windows_x86_64_gnu"
1984
+ version = "0.52.6"
1985
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1986
+ checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
1987
+
1988
+ [[package]]
1989
+ name = "windows_x86_64_gnu"
1990
+ version = "0.53.0"
1991
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1992
+ checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba"
1993
+
1994
+ [[package]]
1995
+ name = "windows_x86_64_gnullvm"
1996
+ version = "0.52.6"
1997
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1998
+ checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
1999
+
2000
+ [[package]]
2001
+ name = "windows_x86_64_gnullvm"
2002
+ version = "0.53.0"
2003
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2004
+ checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57"
2005
+
2006
+ [[package]]
2007
+ name = "windows_x86_64_msvc"
2008
+ version = "0.52.6"
2009
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2010
+ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
2011
+
2012
+ [[package]]
2013
+ name = "windows_x86_64_msvc"
2014
+ version = "0.53.0"
2015
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2016
+ checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486"
2017
+
2018
+ [[package]]
2019
+ name = "wit-bindgen-rt"
2020
+ version = "0.39.0"
2021
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2022
+ checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1"
2023
+ dependencies = [
2024
+ "bitflags",
2025
+ ]
2026
+
2027
+ [[package]]
2028
+ name = "writeable"
2029
+ version = "0.6.1"
2030
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2031
+ checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb"
2032
+
2033
+ [[package]]
2034
+ name = "yoke"
2035
+ version = "0.8.0"
2036
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2037
+ checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc"
2038
+ dependencies = [
2039
+ "serde",
2040
+ "stable_deref_trait",
2041
+ "yoke-derive",
2042
+ "zerofrom",
2043
+ ]
2044
+
2045
+ [[package]]
2046
+ name = "yoke-derive"
2047
+ version = "0.8.0"
2048
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2049
+ checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6"
2050
+ dependencies = [
2051
+ "proc-macro2",
2052
+ "quote",
2053
+ "syn",
2054
+ "synstructure",
2055
+ ]
2056
+
2057
+ [[package]]
2058
+ name = "zerofrom"
2059
+ version = "0.1.6"
2060
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2061
+ checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5"
2062
+ dependencies = [
2063
+ "zerofrom-derive",
2064
+ ]
2065
+
2066
+ [[package]]
2067
+ name = "zerofrom-derive"
2068
+ version = "0.1.6"
2069
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2070
+ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502"
2071
+ dependencies = [
2072
+ "proc-macro2",
2073
+ "quote",
2074
+ "syn",
2075
+ "synstructure",
2076
+ ]
2077
+
2078
+ [[package]]
2079
+ name = "zeroize"
2080
+ version = "1.8.1"
2081
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2082
+ checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde"
2083
+
2084
+ [[package]]
2085
+ name = "zerotrie"
2086
+ version = "0.2.2"
2087
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2088
+ checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595"
2089
+ dependencies = [
2090
+ "displaydoc",
2091
+ "yoke",
2092
+ "zerofrom",
2093
+ ]
2094
+
2095
+ [[package]]
2096
+ name = "zerovec"
2097
+ version = "0.11.2"
2098
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2099
+ checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428"
2100
+ dependencies = [
2101
+ "yoke",
2102
+ "zerofrom",
2103
+ "zerovec-derive",
2104
+ ]
2105
+
2106
+ [[package]]
2107
+ name = "zerovec-derive"
2108
+ version = "0.11.1"
2109
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2110
+ checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f"
2111
+ dependencies = [
2112
+ "proc-macro2",
2113
+ "quote",
2114
+ "syn",
2115
+ ]
weather-server-rust/Cargo.toml ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [package]
2
+ name = "weather"
3
+ version = "0.1.0"
4
+ edition = "2024"
5
+
6
+ [dependencies]
7
+ rmcp = { version = "0.3", features = ["server", "macros", "transport-io"] }
8
+ tokio = { version = "1.46", features = ["full"] }
9
+ reqwest = { version = "0.12", features = ["json"] }
10
+ serde = { version = "1.0", features = ["derive"] }
11
+ serde_json = "1.0"
12
+ anyhow = "1.0"
13
+ tracing = "0.1"
14
+ tracing-subscriber = { version = "0.3", features = ["env-filter", "std", "fmt"] }
weather-server-rust/README.md ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ # A Simple MCP Weather Server written in Rust
2
+
3
+ See the [Quickstart](https://modelcontextprotocol.io/quickstart) tutorial for more information.
weather-server-rust/src/main.rs ADDED
@@ -0,0 +1,206 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ use anyhow::Result;
2
+ use rmcp::{
3
+ ServerHandler, ServiceExt,
4
+ handler::server::{router::tool::ToolRouter, tool::Parameters},
5
+ model::*,
6
+ schemars, tool, tool_handler, tool_router,
7
+ };
8
+ use serde::Deserialize;
9
+ use serde::de::DeserializeOwned;
10
+
11
+ const NWS_API_BASE: &str = "https://api.weather.gov";
12
+ const USER_AGENT: &str = "weather-app/1.0";
13
+
14
+ #[derive(Debug, Deserialize)]
15
+ struct AlertsResponse {
16
+ features: Vec<AlertFeature>,
17
+ }
18
+
19
+ #[derive(Debug, Deserialize)]
20
+ struct AlertFeature {
21
+ properties: AlertProperties,
22
+ }
23
+
24
+ #[derive(Debug, Deserialize)]
25
+ struct AlertProperties {
26
+ event: Option<String>,
27
+ #[serde(rename = "areaDesc")]
28
+ area_desc: Option<String>,
29
+ severity: Option<String>,
30
+ description: Option<String>,
31
+ instruction: Option<String>,
32
+ }
33
+
34
+ #[derive(Debug, Deserialize)]
35
+ struct PointsResponse {
36
+ properties: PointsProperties,
37
+ }
38
+
39
+ #[derive(Debug, Deserialize)]
40
+ struct PointsProperties {
41
+ forecast: String,
42
+ }
43
+
44
+ #[derive(Debug, Deserialize)]
45
+ struct ForecastResponse {
46
+ properties: ForecastProperties,
47
+ }
48
+
49
+ #[derive(Debug, Deserialize)]
50
+ struct ForecastProperties {
51
+ periods: Vec<ForecastPeriod>,
52
+ }
53
+
54
+ #[derive(Debug, Deserialize)]
55
+ struct ForecastPeriod {
56
+ name: String,
57
+ temperature: i32,
58
+ #[serde(rename = "temperatureUnit")]
59
+ temperature_unit: String,
60
+ #[serde(rename = "windSpeed")]
61
+ wind_speed: String,
62
+ #[serde(rename = "windDirection")]
63
+ wind_direction: String,
64
+ #[serde(rename = "detailedForecast")]
65
+ detailed_forecast: String,
66
+ }
67
+
68
+ async fn make_nws_request<T: DeserializeOwned>(url: &str) -> Result<T> {
69
+ let client = reqwest::Client::new();
70
+ let rsp = client
71
+ .get(url)
72
+ .header(reqwest::header::USER_AGENT, USER_AGENT)
73
+ .header(reqwest::header::ACCEPT, "application/geo+json")
74
+ .send()
75
+ .await?
76
+ .error_for_status()?;
77
+ Ok(rsp.json::<T>().await?)
78
+ }
79
+
80
+ fn format_alert(feature: &AlertFeature) -> String {
81
+ let props = &feature.properties;
82
+ format!(
83
+ "Event: {}\nArea: {}\nSeverity: {}\nDescription: {}\nInstructions: {}",
84
+ props.event.as_deref().unwrap_or("Unknown"),
85
+ props.area_desc.as_deref().unwrap_or("Unknown"),
86
+ props.severity.as_deref().unwrap_or("Unknown"),
87
+ props
88
+ .description
89
+ .as_deref()
90
+ .unwrap_or("No description available"),
91
+ props
92
+ .instruction
93
+ .as_deref()
94
+ .unwrap_or("No specific instructions provided")
95
+ )
96
+ }
97
+
98
+ fn format_period(period: &ForecastPeriod) -> String {
99
+ format!(
100
+ "{}:\nTemperature: {}°{}\nWind: {} {}\nForecast: {}",
101
+ period.name,
102
+ period.temperature,
103
+ period.temperature_unit,
104
+ period.wind_speed,
105
+ period.wind_direction,
106
+ period.detailed_forecast
107
+ )
108
+ }
109
+
110
+ #[derive(serde::Deserialize, schemars::JsonSchema)]
111
+ pub struct MCPForecastRequest {
112
+ latitude: f32,
113
+ longitude: f32,
114
+ }
115
+
116
+ #[derive(serde::Deserialize, schemars::JsonSchema)]
117
+ pub struct MCPAlertRequest {
118
+ state: String,
119
+ }
120
+
121
+ pub struct Weather {
122
+ tool_router: ToolRouter<Weather>,
123
+ }
124
+
125
+ #[tool_router]
126
+ impl Weather {
127
+ fn new() -> Self {
128
+ Self {
129
+ tool_router: Self::tool_router(),
130
+ }
131
+ }
132
+
133
+ #[tool(description = "Get weather alerts for a US state.")]
134
+ async fn get_alerts(
135
+ &self,
136
+ Parameters(MCPAlertRequest { state }): Parameters<MCPAlertRequest>,
137
+ ) -> String {
138
+ let url = format!(
139
+ "{}/alerts/active/area/{}",
140
+ NWS_API_BASE,
141
+ state.to_uppercase()
142
+ );
143
+
144
+ match make_nws_request::<AlertsResponse>(&url).await {
145
+ Ok(data) => {
146
+ if data.features.is_empty() {
147
+ "No active alerts for this state.".to_string()
148
+ } else {
149
+ data.features
150
+ .iter()
151
+ .map(format_alert)
152
+ .collect::<Vec<_>>()
153
+ .join("\n---\n")
154
+ }
155
+ }
156
+ Err(_) => "Unable to fetch alerts or no alerts found.".to_string(),
157
+ }
158
+ }
159
+
160
+ #[tool(description = "Get weather forecast for a location.")]
161
+ async fn get_forecast(
162
+ &self,
163
+ Parameters(MCPForecastRequest {
164
+ latitude,
165
+ longitude,
166
+ }): Parameters<MCPForecastRequest>,
167
+ ) -> String {
168
+ let points_url = format!("{NWS_API_BASE}/points/{latitude},{longitude}");
169
+ let Ok(points_data) = make_nws_request::<PointsResponse>(&points_url).await else {
170
+ return "Unable to fetch forecast data for this location.".to_string();
171
+ };
172
+
173
+ let forecast_url = points_data.properties.forecast;
174
+
175
+ let Ok(forecast_data) = make_nws_request::<ForecastResponse>(&forecast_url).await else {
176
+ return "Unable to fetch forecast data for this location.".to_string();
177
+ };
178
+
179
+ let periods = &forecast_data.properties.periods;
180
+ let forecast_summary: String = periods
181
+ .iter()
182
+ .take(5) // Next 5 periods only
183
+ .map(format_period)
184
+ .collect::<Vec<String>>()
185
+ .join("\n---\n");
186
+ forecast_summary
187
+ }
188
+ }
189
+
190
+ #[tool_handler]
191
+ impl ServerHandler for Weather {
192
+ fn get_info(&self) -> ServerInfo {
193
+ ServerInfo {
194
+ capabilities: ServerCapabilities::builder().enable_tools().build(),
195
+ ..Default::default()
196
+ }
197
+ }
198
+ }
199
+
200
+ #[tokio::main]
201
+ async fn main() -> Result<()> {
202
+ let transport = (tokio::io::stdin(), tokio::io::stdout());
203
+ let service = Weather::new().serve(transport).await?;
204
+ service.waiting().await?;
205
+ Ok(())
206
+ }
weather-server-typescript/README.md ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ # A Simple MCP weather Server written in TypeScript
2
+
3
+ See the [Quickstart](https://modelcontextprotocol.io/quickstart) tutorial for more information.
weather-server-typescript/package-lock.json ADDED
@@ -0,0 +1,1075 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "mcp-quickstart-ts",
3
+ "version": "1.0.0",
4
+ "lockfileVersion": 3,
5
+ "requires": true,
6
+ "packages": {
7
+ "": {
8
+ "name": "mcp-quickstart-ts",
9
+ "version": "1.0.0",
10
+ "license": "ISC",
11
+ "dependencies": {
12
+ "@modelcontextprotocol/sdk": "^1.24.3"
13
+ },
14
+ "bin": {
15
+ "weather": "build/index.js"
16
+ },
17
+ "devDependencies": {
18
+ "@types/node": "^22.19.2",
19
+ "typescript": "^5.9.3"
20
+ }
21
+ },
22
+ "node_modules/@hono/node-server": {
23
+ "version": "1.19.7",
24
+ "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.7.tgz",
25
+ "integrity": "sha512-vUcD0uauS7EU2caukW8z5lJKtoGMokxNbJtBiwHgpqxEXokaHCBkQUmCHhjFB1VUTWdqj25QoMkMKzgjq+uhrw==",
26
+ "license": "MIT",
27
+ "engines": {
28
+ "node": ">=18.14.1"
29
+ },
30
+ "peerDependencies": {
31
+ "hono": "^4"
32
+ }
33
+ },
34
+ "node_modules/@modelcontextprotocol/sdk": {
35
+ "version": "1.25.2",
36
+ "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.25.2.tgz",
37
+ "integrity": "sha512-LZFeo4F9M5qOhC/Uc1aQSrBHxMrvxett+9KLHt7OhcExtoiRN9DKgbZffMP/nxjutWDQpfMDfP3nkHI4X9ijww==",
38
+ "license": "MIT",
39
+ "dependencies": {
40
+ "@hono/node-server": "^1.19.7",
41
+ "ajv": "^8.17.1",
42
+ "ajv-formats": "^3.0.1",
43
+ "content-type": "^1.0.5",
44
+ "cors": "^2.8.5",
45
+ "cross-spawn": "^7.0.5",
46
+ "eventsource": "^3.0.2",
47
+ "eventsource-parser": "^3.0.0",
48
+ "express": "^5.0.1",
49
+ "express-rate-limit": "^7.5.0",
50
+ "jose": "^6.1.1",
51
+ "json-schema-typed": "^8.0.2",
52
+ "pkce-challenge": "^5.0.0",
53
+ "raw-body": "^3.0.0",
54
+ "zod": "^3.25 || ^4.0",
55
+ "zod-to-json-schema": "^3.25.0"
56
+ },
57
+ "engines": {
58
+ "node": ">=18"
59
+ },
60
+ "peerDependencies": {
61
+ "@cfworker/json-schema": "^4.1.1",
62
+ "zod": "^3.25 || ^4.0"
63
+ },
64
+ "peerDependenciesMeta": {
65
+ "@cfworker/json-schema": {
66
+ "optional": true
67
+ },
68
+ "zod": {
69
+ "optional": false
70
+ }
71
+ }
72
+ },
73
+ "node_modules/@types/node": {
74
+ "version": "22.19.2",
75
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.2.tgz",
76
+ "integrity": "sha512-LPM2G3Syo1GLzXLGJAKdqoU35XvrWzGJ21/7sgZTUpbkBaOasTj8tjwn6w+hCkqaa1TfJ/w67rJSwYItlJ2mYw==",
77
+ "dev": true,
78
+ "dependencies": {
79
+ "undici-types": "~6.21.0"
80
+ }
81
+ },
82
+ "node_modules/accepts": {
83
+ "version": "2.0.0",
84
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz",
85
+ "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==",
86
+ "dependencies": {
87
+ "mime-types": "^3.0.0",
88
+ "negotiator": "^1.0.0"
89
+ },
90
+ "engines": {
91
+ "node": ">= 0.6"
92
+ }
93
+ },
94
+ "node_modules/ajv": {
95
+ "version": "8.17.1",
96
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
97
+ "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
98
+ "dependencies": {
99
+ "fast-deep-equal": "^3.1.3",
100
+ "fast-uri": "^3.0.1",
101
+ "json-schema-traverse": "^1.0.0",
102
+ "require-from-string": "^2.0.2"
103
+ },
104
+ "funding": {
105
+ "type": "github",
106
+ "url": "https://github.com/sponsors/epoberezkin"
107
+ }
108
+ },
109
+ "node_modules/ajv-formats": {
110
+ "version": "3.0.1",
111
+ "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz",
112
+ "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==",
113
+ "dependencies": {
114
+ "ajv": "^8.0.0"
115
+ },
116
+ "peerDependencies": {
117
+ "ajv": "^8.0.0"
118
+ },
119
+ "peerDependenciesMeta": {
120
+ "ajv": {
121
+ "optional": true
122
+ }
123
+ }
124
+ },
125
+ "node_modules/body-parser": {
126
+ "version": "2.2.1",
127
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.1.tgz",
128
+ "integrity": "sha512-nfDwkulwiZYQIGwxdy0RUmowMhKcFVcYXUU7m4QlKYim1rUtg83xm2yjZ40QjDuc291AJjjeSc9b++AWHSgSHw==",
129
+ "dependencies": {
130
+ "bytes": "^3.1.2",
131
+ "content-type": "^1.0.5",
132
+ "debug": "^4.4.3",
133
+ "http-errors": "^2.0.0",
134
+ "iconv-lite": "^0.7.0",
135
+ "on-finished": "^2.4.1",
136
+ "qs": "^6.14.0",
137
+ "raw-body": "^3.0.1",
138
+ "type-is": "^2.0.1"
139
+ },
140
+ "engines": {
141
+ "node": ">=18"
142
+ },
143
+ "funding": {
144
+ "type": "opencollective",
145
+ "url": "https://opencollective.com/express"
146
+ }
147
+ },
148
+ "node_modules/bytes": {
149
+ "version": "3.1.2",
150
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
151
+ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
152
+ "license": "MIT",
153
+ "engines": {
154
+ "node": ">= 0.8"
155
+ }
156
+ },
157
+ "node_modules/call-bind-apply-helpers": {
158
+ "version": "1.0.2",
159
+ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
160
+ "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
161
+ "dependencies": {
162
+ "es-errors": "^1.3.0",
163
+ "function-bind": "^1.1.2"
164
+ },
165
+ "engines": {
166
+ "node": ">= 0.4"
167
+ }
168
+ },
169
+ "node_modules/call-bound": {
170
+ "version": "1.0.4",
171
+ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
172
+ "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
173
+ "dependencies": {
174
+ "call-bind-apply-helpers": "^1.0.2",
175
+ "get-intrinsic": "^1.3.0"
176
+ },
177
+ "engines": {
178
+ "node": ">= 0.4"
179
+ },
180
+ "funding": {
181
+ "url": "https://github.com/sponsors/ljharb"
182
+ }
183
+ },
184
+ "node_modules/content-disposition": {
185
+ "version": "1.0.1",
186
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz",
187
+ "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==",
188
+ "engines": {
189
+ "node": ">=18"
190
+ },
191
+ "funding": {
192
+ "type": "opencollective",
193
+ "url": "https://opencollective.com/express"
194
+ }
195
+ },
196
+ "node_modules/content-type": {
197
+ "version": "1.0.5",
198
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
199
+ "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
200
+ "license": "MIT",
201
+ "engines": {
202
+ "node": ">= 0.6"
203
+ }
204
+ },
205
+ "node_modules/cookie": {
206
+ "version": "0.7.2",
207
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz",
208
+ "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==",
209
+ "engines": {
210
+ "node": ">= 0.6"
211
+ }
212
+ },
213
+ "node_modules/cookie-signature": {
214
+ "version": "1.2.2",
215
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz",
216
+ "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==",
217
+ "engines": {
218
+ "node": ">=6.6.0"
219
+ }
220
+ },
221
+ "node_modules/cors": {
222
+ "version": "2.8.5",
223
+ "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
224
+ "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
225
+ "dependencies": {
226
+ "object-assign": "^4",
227
+ "vary": "^1"
228
+ },
229
+ "engines": {
230
+ "node": ">= 0.10"
231
+ }
232
+ },
233
+ "node_modules/cross-spawn": {
234
+ "version": "7.0.6",
235
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
236
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
237
+ "dependencies": {
238
+ "path-key": "^3.1.0",
239
+ "shebang-command": "^2.0.0",
240
+ "which": "^2.0.1"
241
+ },
242
+ "engines": {
243
+ "node": ">= 8"
244
+ }
245
+ },
246
+ "node_modules/debug": {
247
+ "version": "4.4.3",
248
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
249
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
250
+ "dependencies": {
251
+ "ms": "^2.1.3"
252
+ },
253
+ "engines": {
254
+ "node": ">=6.0"
255
+ },
256
+ "peerDependenciesMeta": {
257
+ "supports-color": {
258
+ "optional": true
259
+ }
260
+ }
261
+ },
262
+ "node_modules/depd": {
263
+ "version": "2.0.0",
264
+ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
265
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
266
+ "license": "MIT",
267
+ "engines": {
268
+ "node": ">= 0.8"
269
+ }
270
+ },
271
+ "node_modules/dunder-proto": {
272
+ "version": "1.0.1",
273
+ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
274
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
275
+ "dependencies": {
276
+ "call-bind-apply-helpers": "^1.0.1",
277
+ "es-errors": "^1.3.0",
278
+ "gopd": "^1.2.0"
279
+ },
280
+ "engines": {
281
+ "node": ">= 0.4"
282
+ }
283
+ },
284
+ "node_modules/ee-first": {
285
+ "version": "1.1.1",
286
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
287
+ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
288
+ },
289
+ "node_modules/encodeurl": {
290
+ "version": "2.0.0",
291
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
292
+ "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
293
+ "engines": {
294
+ "node": ">= 0.8"
295
+ }
296
+ },
297
+ "node_modules/es-define-property": {
298
+ "version": "1.0.1",
299
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
300
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
301
+ "engines": {
302
+ "node": ">= 0.4"
303
+ }
304
+ },
305
+ "node_modules/es-errors": {
306
+ "version": "1.3.0",
307
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
308
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
309
+ "engines": {
310
+ "node": ">= 0.4"
311
+ }
312
+ },
313
+ "node_modules/es-object-atoms": {
314
+ "version": "1.1.1",
315
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
316
+ "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
317
+ "dependencies": {
318
+ "es-errors": "^1.3.0"
319
+ },
320
+ "engines": {
321
+ "node": ">= 0.4"
322
+ }
323
+ },
324
+ "node_modules/escape-html": {
325
+ "version": "1.0.3",
326
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
327
+ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
328
+ },
329
+ "node_modules/etag": {
330
+ "version": "1.8.1",
331
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
332
+ "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
333
+ "engines": {
334
+ "node": ">= 0.6"
335
+ }
336
+ },
337
+ "node_modules/eventsource": {
338
+ "version": "3.0.5",
339
+ "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.5.tgz",
340
+ "integrity": "sha512-LT/5J605bx5SNyE+ITBDiM3FxffBiq9un7Vx0EwMDM3vg8sWKx/tO2zC+LMqZ+smAM0F2hblaDZUVZF0te2pSw==",
341
+ "license": "MIT",
342
+ "dependencies": {
343
+ "eventsource-parser": "^3.0.0"
344
+ },
345
+ "engines": {
346
+ "node": ">=18.0.0"
347
+ }
348
+ },
349
+ "node_modules/eventsource-parser": {
350
+ "version": "3.0.0",
351
+ "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.0.tgz",
352
+ "integrity": "sha512-T1C0XCUimhxVQzW4zFipdx0SficT651NnkR0ZSH3yQwh+mFMdLfgjABVi4YtMTtaL4s168593DaoaRLMqryavA==",
353
+ "license": "MIT",
354
+ "engines": {
355
+ "node": ">=18.0.0"
356
+ }
357
+ },
358
+ "node_modules/express": {
359
+ "version": "5.2.1",
360
+ "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz",
361
+ "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==",
362
+ "dependencies": {
363
+ "accepts": "^2.0.0",
364
+ "body-parser": "^2.2.1",
365
+ "content-disposition": "^1.0.0",
366
+ "content-type": "^1.0.5",
367
+ "cookie": "^0.7.1",
368
+ "cookie-signature": "^1.2.1",
369
+ "debug": "^4.4.0",
370
+ "depd": "^2.0.0",
371
+ "encodeurl": "^2.0.0",
372
+ "escape-html": "^1.0.3",
373
+ "etag": "^1.8.1",
374
+ "finalhandler": "^2.1.0",
375
+ "fresh": "^2.0.0",
376
+ "http-errors": "^2.0.0",
377
+ "merge-descriptors": "^2.0.0",
378
+ "mime-types": "^3.0.0",
379
+ "on-finished": "^2.4.1",
380
+ "once": "^1.4.0",
381
+ "parseurl": "^1.3.3",
382
+ "proxy-addr": "^2.0.7",
383
+ "qs": "^6.14.0",
384
+ "range-parser": "^1.2.1",
385
+ "router": "^2.2.0",
386
+ "send": "^1.1.0",
387
+ "serve-static": "^2.2.0",
388
+ "statuses": "^2.0.1",
389
+ "type-is": "^2.0.1",
390
+ "vary": "^1.1.2"
391
+ },
392
+ "engines": {
393
+ "node": ">= 18"
394
+ },
395
+ "funding": {
396
+ "type": "opencollective",
397
+ "url": "https://opencollective.com/express"
398
+ }
399
+ },
400
+ "node_modules/express-rate-limit": {
401
+ "version": "7.5.1",
402
+ "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.5.1.tgz",
403
+ "integrity": "sha512-7iN8iPMDzOMHPUYllBEsQdWVB6fPDMPqwjBaFrgr4Jgr/+okjvzAy+UHlYYL/Vs0OsOrMkwS6PJDkFlJwoxUnw==",
404
+ "engines": {
405
+ "node": ">= 16"
406
+ },
407
+ "funding": {
408
+ "url": "https://github.com/sponsors/express-rate-limit"
409
+ },
410
+ "peerDependencies": {
411
+ "express": ">= 4.11"
412
+ }
413
+ },
414
+ "node_modules/fast-deep-equal": {
415
+ "version": "3.1.3",
416
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
417
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
418
+ },
419
+ "node_modules/fast-uri": {
420
+ "version": "3.1.0",
421
+ "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz",
422
+ "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==",
423
+ "funding": [
424
+ {
425
+ "type": "github",
426
+ "url": "https://github.com/sponsors/fastify"
427
+ },
428
+ {
429
+ "type": "opencollective",
430
+ "url": "https://opencollective.com/fastify"
431
+ }
432
+ ]
433
+ },
434
+ "node_modules/finalhandler": {
435
+ "version": "2.1.1",
436
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz",
437
+ "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==",
438
+ "dependencies": {
439
+ "debug": "^4.4.0",
440
+ "encodeurl": "^2.0.0",
441
+ "escape-html": "^1.0.3",
442
+ "on-finished": "^2.4.1",
443
+ "parseurl": "^1.3.3",
444
+ "statuses": "^2.0.1"
445
+ },
446
+ "engines": {
447
+ "node": ">= 18.0.0"
448
+ },
449
+ "funding": {
450
+ "type": "opencollective",
451
+ "url": "https://opencollective.com/express"
452
+ }
453
+ },
454
+ "node_modules/forwarded": {
455
+ "version": "0.2.0",
456
+ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
457
+ "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
458
+ "engines": {
459
+ "node": ">= 0.6"
460
+ }
461
+ },
462
+ "node_modules/fresh": {
463
+ "version": "2.0.0",
464
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz",
465
+ "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==",
466
+ "engines": {
467
+ "node": ">= 0.8"
468
+ }
469
+ },
470
+ "node_modules/function-bind": {
471
+ "version": "1.1.2",
472
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
473
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
474
+ "funding": {
475
+ "url": "https://github.com/sponsors/ljharb"
476
+ }
477
+ },
478
+ "node_modules/get-intrinsic": {
479
+ "version": "1.3.0",
480
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
481
+ "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
482
+ "dependencies": {
483
+ "call-bind-apply-helpers": "^1.0.2",
484
+ "es-define-property": "^1.0.1",
485
+ "es-errors": "^1.3.0",
486
+ "es-object-atoms": "^1.1.1",
487
+ "function-bind": "^1.1.2",
488
+ "get-proto": "^1.0.1",
489
+ "gopd": "^1.2.0",
490
+ "has-symbols": "^1.1.0",
491
+ "hasown": "^2.0.2",
492
+ "math-intrinsics": "^1.1.0"
493
+ },
494
+ "engines": {
495
+ "node": ">= 0.4"
496
+ },
497
+ "funding": {
498
+ "url": "https://github.com/sponsors/ljharb"
499
+ }
500
+ },
501
+ "node_modules/get-proto": {
502
+ "version": "1.0.1",
503
+ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
504
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
505
+ "dependencies": {
506
+ "dunder-proto": "^1.0.1",
507
+ "es-object-atoms": "^1.0.0"
508
+ },
509
+ "engines": {
510
+ "node": ">= 0.4"
511
+ }
512
+ },
513
+ "node_modules/gopd": {
514
+ "version": "1.2.0",
515
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
516
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
517
+ "engines": {
518
+ "node": ">= 0.4"
519
+ },
520
+ "funding": {
521
+ "url": "https://github.com/sponsors/ljharb"
522
+ }
523
+ },
524
+ "node_modules/has-symbols": {
525
+ "version": "1.1.0",
526
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
527
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
528
+ "engines": {
529
+ "node": ">= 0.4"
530
+ },
531
+ "funding": {
532
+ "url": "https://github.com/sponsors/ljharb"
533
+ }
534
+ },
535
+ "node_modules/hasown": {
536
+ "version": "2.0.2",
537
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
538
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
539
+ "dependencies": {
540
+ "function-bind": "^1.1.2"
541
+ },
542
+ "engines": {
543
+ "node": ">= 0.4"
544
+ }
545
+ },
546
+ "node_modules/hono": {
547
+ "version": "4.11.4",
548
+ "resolved": "https://registry.npmjs.org/hono/-/hono-4.11.4.tgz",
549
+ "integrity": "sha512-U7tt8JsyrxSRKspfhtLET79pU8K+tInj5QZXs1jSugO1Vq5dFj3kmZsRldo29mTBfcjDRVRXrEZ6LS63Cog9ZA==",
550
+ "license": "MIT",
551
+ "peer": true,
552
+ "engines": {
553
+ "node": ">=16.9.0"
554
+ }
555
+ },
556
+ "node_modules/http-errors": {
557
+ "version": "2.0.1",
558
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz",
559
+ "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==",
560
+ "dependencies": {
561
+ "depd": "~2.0.0",
562
+ "inherits": "~2.0.4",
563
+ "setprototypeof": "~1.2.0",
564
+ "statuses": "~2.0.2",
565
+ "toidentifier": "~1.0.1"
566
+ },
567
+ "engines": {
568
+ "node": ">= 0.8"
569
+ },
570
+ "funding": {
571
+ "type": "opencollective",
572
+ "url": "https://opencollective.com/express"
573
+ }
574
+ },
575
+ "node_modules/iconv-lite": {
576
+ "version": "0.7.1",
577
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.1.tgz",
578
+ "integrity": "sha512-2Tth85cXwGFHfvRgZWszZSvdo+0Xsqmw8k8ZwxScfcBneNUraK+dxRxRm24nszx80Y0TVio8kKLt5sLE7ZCLlw==",
579
+ "dependencies": {
580
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
581
+ },
582
+ "engines": {
583
+ "node": ">=0.10.0"
584
+ },
585
+ "funding": {
586
+ "type": "opencollective",
587
+ "url": "https://opencollective.com/express"
588
+ }
589
+ },
590
+ "node_modules/inherits": {
591
+ "version": "2.0.4",
592
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
593
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
594
+ "license": "ISC"
595
+ },
596
+ "node_modules/ipaddr.js": {
597
+ "version": "1.9.1",
598
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
599
+ "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
600
+ "engines": {
601
+ "node": ">= 0.10"
602
+ }
603
+ },
604
+ "node_modules/is-promise": {
605
+ "version": "4.0.0",
606
+ "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz",
607
+ "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ=="
608
+ },
609
+ "node_modules/isexe": {
610
+ "version": "2.0.0",
611
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
612
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="
613
+ },
614
+ "node_modules/jose": {
615
+ "version": "6.1.3",
616
+ "resolved": "https://registry.npmjs.org/jose/-/jose-6.1.3.tgz",
617
+ "integrity": "sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ==",
618
+ "funding": {
619
+ "url": "https://github.com/sponsors/panva"
620
+ }
621
+ },
622
+ "node_modules/json-schema-traverse": {
623
+ "version": "1.0.0",
624
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
625
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="
626
+ },
627
+ "node_modules/json-schema-typed": {
628
+ "version": "8.0.2",
629
+ "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-8.0.2.tgz",
630
+ "integrity": "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==",
631
+ "license": "BSD-2-Clause"
632
+ },
633
+ "node_modules/math-intrinsics": {
634
+ "version": "1.1.0",
635
+ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
636
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
637
+ "engines": {
638
+ "node": ">= 0.4"
639
+ }
640
+ },
641
+ "node_modules/media-typer": {
642
+ "version": "1.1.0",
643
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz",
644
+ "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==",
645
+ "engines": {
646
+ "node": ">= 0.8"
647
+ }
648
+ },
649
+ "node_modules/merge-descriptors": {
650
+ "version": "2.0.0",
651
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz",
652
+ "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==",
653
+ "engines": {
654
+ "node": ">=18"
655
+ },
656
+ "funding": {
657
+ "url": "https://github.com/sponsors/sindresorhus"
658
+ }
659
+ },
660
+ "node_modules/mime-db": {
661
+ "version": "1.54.0",
662
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz",
663
+ "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==",
664
+ "engines": {
665
+ "node": ">= 0.6"
666
+ }
667
+ },
668
+ "node_modules/mime-types": {
669
+ "version": "3.0.2",
670
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz",
671
+ "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==",
672
+ "dependencies": {
673
+ "mime-db": "^1.54.0"
674
+ },
675
+ "engines": {
676
+ "node": ">=18"
677
+ },
678
+ "funding": {
679
+ "type": "opencollective",
680
+ "url": "https://opencollective.com/express"
681
+ }
682
+ },
683
+ "node_modules/ms": {
684
+ "version": "2.1.3",
685
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
686
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
687
+ },
688
+ "node_modules/negotiator": {
689
+ "version": "1.0.0",
690
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz",
691
+ "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==",
692
+ "engines": {
693
+ "node": ">= 0.6"
694
+ }
695
+ },
696
+ "node_modules/object-assign": {
697
+ "version": "4.1.1",
698
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
699
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
700
+ "engines": {
701
+ "node": ">=0.10.0"
702
+ }
703
+ },
704
+ "node_modules/object-inspect": {
705
+ "version": "1.13.4",
706
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
707
+ "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
708
+ "engines": {
709
+ "node": ">= 0.4"
710
+ },
711
+ "funding": {
712
+ "url": "https://github.com/sponsors/ljharb"
713
+ }
714
+ },
715
+ "node_modules/on-finished": {
716
+ "version": "2.4.1",
717
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
718
+ "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
719
+ "dependencies": {
720
+ "ee-first": "1.1.1"
721
+ },
722
+ "engines": {
723
+ "node": ">= 0.8"
724
+ }
725
+ },
726
+ "node_modules/once": {
727
+ "version": "1.4.0",
728
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
729
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
730
+ "dependencies": {
731
+ "wrappy": "1"
732
+ }
733
+ },
734
+ "node_modules/parseurl": {
735
+ "version": "1.3.3",
736
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
737
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
738
+ "engines": {
739
+ "node": ">= 0.8"
740
+ }
741
+ },
742
+ "node_modules/path-key": {
743
+ "version": "3.1.1",
744
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
745
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
746
+ "engines": {
747
+ "node": ">=8"
748
+ }
749
+ },
750
+ "node_modules/path-to-regexp": {
751
+ "version": "8.3.0",
752
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz",
753
+ "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==",
754
+ "funding": {
755
+ "type": "opencollective",
756
+ "url": "https://opencollective.com/express"
757
+ }
758
+ },
759
+ "node_modules/pkce-challenge": {
760
+ "version": "5.0.1",
761
+ "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.1.tgz",
762
+ "integrity": "sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==",
763
+ "engines": {
764
+ "node": ">=16.20.0"
765
+ }
766
+ },
767
+ "node_modules/proxy-addr": {
768
+ "version": "2.0.7",
769
+ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
770
+ "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
771
+ "dependencies": {
772
+ "forwarded": "0.2.0",
773
+ "ipaddr.js": "1.9.1"
774
+ },
775
+ "engines": {
776
+ "node": ">= 0.10"
777
+ }
778
+ },
779
+ "node_modules/qs": {
780
+ "version": "6.14.1",
781
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz",
782
+ "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==",
783
+ "license": "BSD-3-Clause",
784
+ "dependencies": {
785
+ "side-channel": "^1.1.0"
786
+ },
787
+ "engines": {
788
+ "node": ">=0.6"
789
+ },
790
+ "funding": {
791
+ "url": "https://github.com/sponsors/ljharb"
792
+ }
793
+ },
794
+ "node_modules/range-parser": {
795
+ "version": "1.2.1",
796
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
797
+ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
798
+ "engines": {
799
+ "node": ">= 0.6"
800
+ }
801
+ },
802
+ "node_modules/raw-body": {
803
+ "version": "3.0.2",
804
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz",
805
+ "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==",
806
+ "dependencies": {
807
+ "bytes": "~3.1.2",
808
+ "http-errors": "~2.0.1",
809
+ "iconv-lite": "~0.7.0",
810
+ "unpipe": "~1.0.0"
811
+ },
812
+ "engines": {
813
+ "node": ">= 0.10"
814
+ }
815
+ },
816
+ "node_modules/require-from-string": {
817
+ "version": "2.0.2",
818
+ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
819
+ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
820
+ "engines": {
821
+ "node": ">=0.10.0"
822
+ }
823
+ },
824
+ "node_modules/router": {
825
+ "version": "2.2.0",
826
+ "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz",
827
+ "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==",
828
+ "dependencies": {
829
+ "debug": "^4.4.0",
830
+ "depd": "^2.0.0",
831
+ "is-promise": "^4.0.0",
832
+ "parseurl": "^1.3.3",
833
+ "path-to-regexp": "^8.0.0"
834
+ },
835
+ "engines": {
836
+ "node": ">= 18"
837
+ }
838
+ },
839
+ "node_modules/safer-buffer": {
840
+ "version": "2.1.2",
841
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
842
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
843
+ "license": "MIT"
844
+ },
845
+ "node_modules/send": {
846
+ "version": "1.2.0",
847
+ "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz",
848
+ "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==",
849
+ "dependencies": {
850
+ "debug": "^4.3.5",
851
+ "encodeurl": "^2.0.0",
852
+ "escape-html": "^1.0.3",
853
+ "etag": "^1.8.1",
854
+ "fresh": "^2.0.0",
855
+ "http-errors": "^2.0.0",
856
+ "mime-types": "^3.0.1",
857
+ "ms": "^2.1.3",
858
+ "on-finished": "^2.4.1",
859
+ "range-parser": "^1.2.1",
860
+ "statuses": "^2.0.1"
861
+ },
862
+ "engines": {
863
+ "node": ">= 18"
864
+ }
865
+ },
866
+ "node_modules/serve-static": {
867
+ "version": "2.2.0",
868
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz",
869
+ "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==",
870
+ "dependencies": {
871
+ "encodeurl": "^2.0.0",
872
+ "escape-html": "^1.0.3",
873
+ "parseurl": "^1.3.3",
874
+ "send": "^1.2.0"
875
+ },
876
+ "engines": {
877
+ "node": ">= 18"
878
+ }
879
+ },
880
+ "node_modules/setprototypeof": {
881
+ "version": "1.2.0",
882
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
883
+ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
884
+ "license": "ISC"
885
+ },
886
+ "node_modules/shebang-command": {
887
+ "version": "2.0.0",
888
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
889
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
890
+ "dependencies": {
891
+ "shebang-regex": "^3.0.0"
892
+ },
893
+ "engines": {
894
+ "node": ">=8"
895
+ }
896
+ },
897
+ "node_modules/shebang-regex": {
898
+ "version": "3.0.0",
899
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
900
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
901
+ "engines": {
902
+ "node": ">=8"
903
+ }
904
+ },
905
+ "node_modules/side-channel": {
906
+ "version": "1.1.0",
907
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
908
+ "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
909
+ "dependencies": {
910
+ "es-errors": "^1.3.0",
911
+ "object-inspect": "^1.13.3",
912
+ "side-channel-list": "^1.0.0",
913
+ "side-channel-map": "^1.0.1",
914
+ "side-channel-weakmap": "^1.0.2"
915
+ },
916
+ "engines": {
917
+ "node": ">= 0.4"
918
+ },
919
+ "funding": {
920
+ "url": "https://github.com/sponsors/ljharb"
921
+ }
922
+ },
923
+ "node_modules/side-channel-list": {
924
+ "version": "1.0.0",
925
+ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
926
+ "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
927
+ "dependencies": {
928
+ "es-errors": "^1.3.0",
929
+ "object-inspect": "^1.13.3"
930
+ },
931
+ "engines": {
932
+ "node": ">= 0.4"
933
+ },
934
+ "funding": {
935
+ "url": "https://github.com/sponsors/ljharb"
936
+ }
937
+ },
938
+ "node_modules/side-channel-map": {
939
+ "version": "1.0.1",
940
+ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
941
+ "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
942
+ "dependencies": {
943
+ "call-bound": "^1.0.2",
944
+ "es-errors": "^1.3.0",
945
+ "get-intrinsic": "^1.2.5",
946
+ "object-inspect": "^1.13.3"
947
+ },
948
+ "engines": {
949
+ "node": ">= 0.4"
950
+ },
951
+ "funding": {
952
+ "url": "https://github.com/sponsors/ljharb"
953
+ }
954
+ },
955
+ "node_modules/side-channel-weakmap": {
956
+ "version": "1.0.2",
957
+ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
958
+ "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
959
+ "dependencies": {
960
+ "call-bound": "^1.0.2",
961
+ "es-errors": "^1.3.0",
962
+ "get-intrinsic": "^1.2.5",
963
+ "object-inspect": "^1.13.3",
964
+ "side-channel-map": "^1.0.1"
965
+ },
966
+ "engines": {
967
+ "node": ">= 0.4"
968
+ },
969
+ "funding": {
970
+ "url": "https://github.com/sponsors/ljharb"
971
+ }
972
+ },
973
+ "node_modules/statuses": {
974
+ "version": "2.0.2",
975
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz",
976
+ "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==",
977
+ "engines": {
978
+ "node": ">= 0.8"
979
+ }
980
+ },
981
+ "node_modules/toidentifier": {
982
+ "version": "1.0.1",
983
+ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
984
+ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
985
+ "license": "MIT",
986
+ "engines": {
987
+ "node": ">=0.6"
988
+ }
989
+ },
990
+ "node_modules/type-is": {
991
+ "version": "2.0.1",
992
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz",
993
+ "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==",
994
+ "dependencies": {
995
+ "content-type": "^1.0.5",
996
+ "media-typer": "^1.1.0",
997
+ "mime-types": "^3.0.0"
998
+ },
999
+ "engines": {
1000
+ "node": ">= 0.6"
1001
+ }
1002
+ },
1003
+ "node_modules/typescript": {
1004
+ "version": "5.9.3",
1005
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
1006
+ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
1007
+ "dev": true,
1008
+ "bin": {
1009
+ "tsc": "bin/tsc",
1010
+ "tsserver": "bin/tsserver"
1011
+ },
1012
+ "engines": {
1013
+ "node": ">=14.17"
1014
+ }
1015
+ },
1016
+ "node_modules/undici-types": {
1017
+ "version": "6.21.0",
1018
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz",
1019
+ "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==",
1020
+ "dev": true
1021
+ },
1022
+ "node_modules/unpipe": {
1023
+ "version": "1.0.0",
1024
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
1025
+ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
1026
+ "license": "MIT",
1027
+ "engines": {
1028
+ "node": ">= 0.8"
1029
+ }
1030
+ },
1031
+ "node_modules/vary": {
1032
+ "version": "1.1.2",
1033
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
1034
+ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
1035
+ "engines": {
1036
+ "node": ">= 0.8"
1037
+ }
1038
+ },
1039
+ "node_modules/which": {
1040
+ "version": "2.0.2",
1041
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
1042
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
1043
+ "dependencies": {
1044
+ "isexe": "^2.0.0"
1045
+ },
1046
+ "bin": {
1047
+ "node-which": "bin/node-which"
1048
+ },
1049
+ "engines": {
1050
+ "node": ">= 8"
1051
+ }
1052
+ },
1053
+ "node_modules/wrappy": {
1054
+ "version": "1.0.2",
1055
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
1056
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
1057
+ },
1058
+ "node_modules/zod": {
1059
+ "version": "4.1.13",
1060
+ "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.13.tgz",
1061
+ "integrity": "sha512-AvvthqfqrAhNH9dnfmrfKzX5upOdjUVJYFqNSlkmGf64gRaTzlPwz99IHYnVs28qYAybvAlBV+H7pn0saFY4Ig==",
1062
+ "funding": {
1063
+ "url": "https://github.com/sponsors/colinhacks"
1064
+ }
1065
+ },
1066
+ "node_modules/zod-to-json-schema": {
1067
+ "version": "3.25.0",
1068
+ "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.0.tgz",
1069
+ "integrity": "sha512-HvWtU2UG41LALjajJrML6uQejQhNJx+JBO9IflpSja4R03iNWfKXrj6W2h7ljuLyc1nKS+9yDyL/9tD1U/yBnQ==",
1070
+ "peerDependencies": {
1071
+ "zod": "^3.25 || ^4"
1072
+ }
1073
+ }
1074
+ }
1075
+ }
weather-server-typescript/package.json ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "mcp-quickstart-ts",
3
+ "version": "1.0.0",
4
+ "main": "index.js",
5
+ "type": "module",
6
+ "bin": {
7
+ "weather": "./build/index.js"
8
+ },
9
+ "scripts": {
10
+ "build": "tsc && node -e \"require('fs').chmodSync('build/index.js', '755')\""
11
+ },
12
+ "files": [
13
+ "build"
14
+ ],
15
+ "keywords": [],
16
+ "author": "",
17
+ "license": "ISC",
18
+ "description": "",
19
+ "devDependencies": {
20
+ "@types/node": "^22.19.2",
21
+ "typescript": "^5.9.3"
22
+ },
23
+ "dependencies": {
24
+ "@modelcontextprotocol/sdk": "^1.24.3"
25
+ }
26
+ }
weather-server-typescript/src/index.ts ADDED
@@ -0,0 +1,234 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
3
+ import { z } from "zod";
4
+
5
+ const NWS_API_BASE = "https://api.weather.gov";
6
+ const USER_AGENT = "weather-app/1.0";
7
+
8
+ // Helper function for making NWS API requests
9
+ async function makeNWSRequest<T>(url: string): Promise<T | null> {
10
+ const headers = {
11
+ "User-Agent": USER_AGENT,
12
+ Accept: "application/geo+json",
13
+ };
14
+
15
+ try {
16
+ const response = await fetch(url, { headers });
17
+ if (!response.ok) {
18
+ throw new Error(`HTTP error! status: ${response.status}`);
19
+ }
20
+ return (await response.json()) as T;
21
+ } catch (error) {
22
+ console.error("Error making NWS request:", error);
23
+ return null;
24
+ }
25
+ }
26
+
27
+ interface AlertFeature {
28
+ properties: {
29
+ event?: string;
30
+ areaDesc?: string;
31
+ severity?: string;
32
+ status?: string;
33
+ headline?: string;
34
+ };
35
+ }
36
+
37
+ // Format alert data
38
+ function formatAlert(feature: AlertFeature): string {
39
+ const props = feature.properties;
40
+ return [
41
+ `Event: ${props.event || "Unknown"}`,
42
+ `Area: ${props.areaDesc || "Unknown"}`,
43
+ `Severity: ${props.severity || "Unknown"}`,
44
+ `Status: ${props.status || "Unknown"}`,
45
+ `Headline: ${props.headline || "No headline"}`,
46
+ "---",
47
+ ].join("\n");
48
+ }
49
+
50
+ interface ForecastPeriod {
51
+ name?: string;
52
+ temperature?: number;
53
+ temperatureUnit?: string;
54
+ windSpeed?: string;
55
+ windDirection?: string;
56
+ shortForecast?: string;
57
+ }
58
+
59
+ interface AlertsResponse {
60
+ features: AlertFeature[];
61
+ }
62
+
63
+ interface PointsResponse {
64
+ properties: {
65
+ forecast?: string;
66
+ };
67
+ }
68
+
69
+ interface ForecastResponse {
70
+ properties: {
71
+ periods: ForecastPeriod[];
72
+ };
73
+ }
74
+
75
+ // Create server instance
76
+ const server = new McpServer({
77
+ name: "weather",
78
+ version: "1.0.0",
79
+ });
80
+
81
+ // Register weather tools
82
+ server.registerTool(
83
+ "get-alerts",
84
+ {
85
+ title: "Get Weather Alerts",
86
+ description: "Get weather alerts for a state",
87
+ inputSchema: {
88
+ state: z.string().length(2).describe("Two-letter state code (e.g. CA, NY)"),
89
+ },
90
+ },
91
+ async ({ state }) => {
92
+ const stateCode = state.toUpperCase();
93
+ const alertsUrl = `${NWS_API_BASE}/alerts?area=${stateCode}`;
94
+ const alertsData = await makeNWSRequest<AlertsResponse>(alertsUrl);
95
+
96
+ if (!alertsData) {
97
+ return {
98
+ content: [
99
+ {
100
+ type: "text",
101
+ text: "Failed to retrieve alerts data",
102
+ },
103
+ ],
104
+ };
105
+ }
106
+
107
+ const features = alertsData.features || [];
108
+ if (features.length === 0) {
109
+ return {
110
+ content: [
111
+ {
112
+ type: "text",
113
+ text: `No active alerts for ${stateCode}`,
114
+ },
115
+ ],
116
+ };
117
+ }
118
+
119
+ const formattedAlerts = features.map(formatAlert);
120
+ const alertsText = `Active alerts for ${stateCode}:\n\n${formattedAlerts.join("\n")}`;
121
+
122
+ return {
123
+ content: [
124
+ {
125
+ type: "text",
126
+ text: alertsText,
127
+ },
128
+ ],
129
+ };
130
+ },
131
+ );
132
+
133
+ server.registerTool(
134
+ "get-forecast",
135
+ {
136
+ title: "Get Weather Forecast",
137
+ description: "Get weather forecast for a location",
138
+ inputSchema: {
139
+ latitude: z.number().min(-90).max(90).describe("Latitude of the location"),
140
+ longitude: z
141
+ .number()
142
+ .min(-180)
143
+ .max(180)
144
+ .describe("Longitude of the location"),
145
+ },
146
+ },
147
+ async ({ latitude, longitude }) => {
148
+ // Get grid point data
149
+ const pointsUrl = `${NWS_API_BASE}/points/${latitude.toFixed(4)},${longitude.toFixed(4)}`;
150
+ const pointsData = await makeNWSRequest<PointsResponse>(pointsUrl);
151
+
152
+ if (!pointsData) {
153
+ return {
154
+ content: [
155
+ {
156
+ type: "text",
157
+ text: `Failed to retrieve grid point data for coordinates: ${latitude}, ${longitude}. This location may not be supported by the NWS API (only US locations are supported).`,
158
+ },
159
+ ],
160
+ };
161
+ }
162
+
163
+ const forecastUrl = pointsData.properties?.forecast;
164
+ if (!forecastUrl) {
165
+ return {
166
+ content: [
167
+ {
168
+ type: "text",
169
+ text: "Failed to get forecast URL from grid point data",
170
+ },
171
+ ],
172
+ };
173
+ }
174
+
175
+ // Get forecast data
176
+ const forecastData = await makeNWSRequest<ForecastResponse>(forecastUrl);
177
+ if (!forecastData) {
178
+ return {
179
+ content: [
180
+ {
181
+ type: "text",
182
+ text: "Failed to retrieve forecast data",
183
+ },
184
+ ],
185
+ };
186
+ }
187
+
188
+ const periods = forecastData.properties?.periods || [];
189
+ if (periods.length === 0) {
190
+ return {
191
+ content: [
192
+ {
193
+ type: "text",
194
+ text: "No forecast periods available",
195
+ },
196
+ ],
197
+ };
198
+ }
199
+
200
+ // Format forecast periods
201
+ const formattedForecast = periods.map((period: ForecastPeriod) =>
202
+ [
203
+ `${period.name || "Unknown"}:`,
204
+ `Temperature: ${period.temperature || "Unknown"}°${period.temperatureUnit || "F"}`,
205
+ `Wind: ${period.windSpeed || "Unknown"} ${period.windDirection || ""}`,
206
+ `${period.shortForecast || "No forecast available"}`,
207
+ "---",
208
+ ].join("\n"),
209
+ );
210
+
211
+ const forecastText = `Forecast for ${latitude}, ${longitude}:\n\n${formattedForecast.join("\n")}`;
212
+
213
+ return {
214
+ content: [
215
+ {
216
+ type: "text",
217
+ text: forecastText,
218
+ },
219
+ ],
220
+ };
221
+ },
222
+ );
223
+
224
+ // Start the server
225
+ async function main() {
226
+ const transport = new StdioServerTransport();
227
+ await server.connect(transport);
228
+ console.error("Weather MCP Server running on stdio");
229
+ }
230
+
231
+ main().catch((error) => {
232
+ console.error("Fatal error in main():", error);
233
+ process.exit(1);
234
+ });
weather-server-typescript/tsconfig.json ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "module": "Node16",
5
+ "moduleResolution": "Node16",
6
+ "outDir": "./build",
7
+ "rootDir": "./src",
8
+ "strict": true,
9
+ "esModuleInterop": true,
10
+ "skipLibCheck": true,
11
+ "forceConsistentCasingInFileNames": true
12
+ },
13
+ "include": ["src/**/*"],
14
+ "exclude": ["node_modules"]
15
+ }