SQLite MCP Server update with demo

This commit is contained in:
Garvan
2024-11-21 13:46:21 -05:00
parent 034f95c788
commit a0c864b2df
5 changed files with 33 additions and 213 deletions

View File

@@ -37,12 +37,18 @@ The server offers six core tools:
## Installation ## Installation
```bash ```bash
# Required: Python 3.10+ # Add the server to your claude_desktop_config.json
python -m pip install mcp-sqlite-server "mcpServers": {
"sqlite": {
# Run with default settings "command": "uv",
mcp-sqlite-server "args": [
"--directory",
# Run with custom database and Anthropic integration "parent_of_servers_repo/servers/src/sqlite",
mcp-sqlite-server --db-path ~/analysis.db --anthropic-key sk-xxx "run",
"sqlite",
"--db-path",
"~/test.db"
]
}
}
``` ```

View File

@@ -6,7 +6,6 @@ readme = "README.md"
requires-python = ">=3.11" requires-python = ">=3.11"
dependencies = [ dependencies = [
"mcp>=0.9.1", "mcp>=0.9.1",
"anthropic>=0.39.0",
] ]
[build-system] [build-system]

View File

@@ -10,12 +10,9 @@ def main():
parser.add_argument('--db-path', parser.add_argument('--db-path',
default="./sqlite_mcp_server.db", default="./sqlite_mcp_server.db",
help='Path to SQLite database file') help='Path to SQLite database file')
parser.add_argument('--anthropic-api-key',
default=os.environ.get('ANTHROPIC_API_KEY'),
help='Anthropic API key (can also be set via ANTHROPIC_API_KEY environment variable)')
args = parser.parse_args() args = parser.parse_args()
asyncio.run(server.main(args.db_path, args.anthropic_api_key)) asyncio.run(server.main(args.db_path))
# Optionally expose other important items at package level # Optionally expose other important items at package level

View File

@@ -7,14 +7,12 @@ from mcp.server.models import InitializationOptions
import mcp.types as types import mcp.types as types
from mcp.server import NotificationOptions, Server, AnyUrl from mcp.server import NotificationOptions, Server, AnyUrl
import mcp.server.stdio import mcp.server.stdio
from anthropic import Anthropic
# Set up logging to file # Set up logging to file
log_file = Path('mcp_server.log') log_file = Path('mcp_server.log')
handler = RotatingFileHandler(log_file, maxBytes=10*1024*1024, backupCount=5) handler = RotatingFileHandler(log_file, maxBytes=10*1024*1024, backupCount=5)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter) handler.setFormatter(formatter)
logger = logging.getLogger('mcp_sqlite_server') logger = logging.getLogger('mcp_sqlite_server')
logger.setLevel(logging.DEBUG) logger.setLevel(logging.DEBUG)
logger.addHandler(handler) logger.addHandler(handler)
@@ -25,23 +23,6 @@ class McpServer(Server):
"""Initialize connection to the SQLite database""" """Initialize connection to the SQLite database"""
logger.debug("Initializing database connection") logger.debug("Initializing database connection")
with closing(sqlite3.connect(self.db_path)) as conn: with closing(sqlite3.connect(self.db_path)) as conn:
<<<<<<< HEAD
with closing(conn.cursor()) as cursor:
cursor.execute("""
CREATE TABLE IF NOT EXISTS notes (
name TEXT PRIMARY KEY,
content TEXT NOT NULL
)
""")
# Add example note if table is empty
cursor.execute("SELECT COUNT(*) FROM notes")
if cursor.fetchone()[0] == 0:
cursor.execute(
"INSERT INTO notes (name, content) VALUES (?, ?)",
("example", "This is an example note."),
)
conn.commit()
=======
conn.row_factory = sqlite3.Row conn.row_factory = sqlite3.Row
conn.close() conn.close()
@@ -53,81 +34,17 @@ class McpServer(Server):
insights = "\n".join(f"- {insight}" for insight in self.insights) insights = "\n".join(f"- {insight}" for insight in self.insights)
if self.anthropic_api_key is None: memo = "📊 Business Intelligence Memo 📊\n\n"
memo = "📊 Business Intelligence Memo 📊\n\n" memo += "Key Insights Discovered:\n\n"
memo += "Key Insights Discovered:\n\n" memo += insights
memo += insights
if len(self.insights) > 1:
if len(self.insights) > 1: memo += "\nSummary:\n"
memo += "\nSummary:\n" memo += f"Analysis has revealed {len(self.insights)} key business insights that suggest opportunities for strategic optimization and growth."
memo += f"Analysis has revealed {len(self.insights)} key business insights that suggest opportunities for strategic optimization and growth."
logger.debug("Generated basic memo format")
logger.debug("Generated basic memo format") return memo
return memo
else:
try:
logger.debug("Requesting memo generation from Anthropic")
prompt = """
You are tasked with summarizing a set of business insights into a formal business memo. The insights are typically 1-2 sentences each and cover various aspects of the business. Your goal is to create a concise, well-organized memo that effectively communicates these insights to the recipient.
>>>>>>> 67b071f (new SQLite server for demo and Getting started guide. Added contributing.md and pull_request_template.md)
Here are the business insights you need to summarize:
<insights>
{insights}
</insights>
<<<<<<< HEAD
def _add_note(self, name: str, content: str):
"""Helper method to add or update a note in the database"""
with closing(sqlite3.connect(self.db_path)) as conn:
with closing(conn.cursor()) as cursor:
cursor.execute(
"INSERT OR REPLACE INTO notes (name, content) VALUES (?, ?)",
(name, content),
=======
To create the memo, follow these steps:
1. Review all the insights carefully.
2. Group related insights together under appropriate subheadings.
3. Summarize each group of insights into 1-2 concise paragraphs.
4. Ensure the memo flows logically from one point to the next.
5. Use professional language and maintain a formal tone throughout the memo.
Format the memo using these guidelines:
- Single-space the content, with a blank line between paragraphs
- Use bullet points or numbered lists where appropriate
- Keep the entire memo to one page if possible, two pages maximum
Write your final memo within <memo> tags. Ensure that all components of the memo are included and properly formatted.
""".format(insights=insights)
message = self.anthropic_client.messages.create(
max_tokens=4096,
messages=[
{
"role": "user",
"content": prompt
},
{
"role": "assistant",
"content": "<memo>"
}
],
model="claude-3-sonnet-20240229",
stop_sequences=["</memo>"],
>>>>>>> 67b071f (new SQLite server for demo and Getting started guide. Added contributing.md and pull_request_template.md)
)
logger.debug("Successfully received memo from Anthropic")
return message.content[0].text.strip()
except Exception as e:
logger.error(f"Error generating memo with Anthropic: {e}")
return insights
<<<<<<< HEAD
def __init__(self):
super().__init__("sqlite")
=======
def _execute_query(self, query: str, params=None) -> list[dict]: def _execute_query(self, query: str, params=None) -> list[dict]:
"""Execute a SQL query and return results as a list of dictionaries""" """Execute a SQL query and return results as a list of dictionaries"""
logger.debug(f"Executing query: {query}") logger.debug(f"Executing query: {query}")
@@ -153,22 +70,16 @@ class McpServer(Server):
logger.error(f"Database error executing query: {e}") logger.error(f"Database error executing query: {e}")
raise raise
def __init__(self, db_path: str = "~/sqlite_mcp_server.db", anthropic_api_key: str | None = None): def __init__(self, db_path: str = "~/sqlite_mcp_server.db"):
logger.info("Initializing McpServer") logger.info("Initializing McpServer")
super().__init__("sqlite-manager") super().__init__("sqlite-manager")
>>>>>>> 67b071f (new SQLite server for demo and Getting started guide. Added contributing.md and pull_request_template.md)
# Initialize SQLite database # Initialize SQLite database
self.db_path = str(Path(db_path).expanduser()) self.db_path = str(Path(db_path).expanduser())
Path(self.db_path).parent.mkdir(parents=True, exist_ok=True) Path(self.db_path).parent.mkdir(parents=True, exist_ok=True)
self._init_database() self._init_database()
logger.debug(f"Initialized database at {self.db_path}") logger.debug(f"Initialized database at {self.db_path}")
# Initialize Anthropic API key
self.anthropic_api_key = anthropic_api_key
if anthropic_api_key:
self.anthropic_client = Anthropic(api_key=anthropic_api_key)
logger.debug("Initialized Anthropic client")
# Initialize insights list # Initialize insights list
self.insights = [] self.insights = []
@@ -181,7 +92,7 @@ class McpServer(Server):
logger.debug("Handling list_resources request") logger.debug("Handling list_resources request")
return [ return [
types.Resource( types.Resource(
uri=AnyUrl("memo://insights"), # Changed from memo:///insights uri=AnyUrl("memo://insights"),
name="Business Insights Memo", name="Business Insights Memo",
description="A living document of discovered business insights", description="A living document of discovered business insights",
mimeType="text/plain", mimeType="text/plain",
@@ -195,7 +106,7 @@ class McpServer(Server):
logger.error(f"Unsupported URI scheme: {uri.scheme}") logger.error(f"Unsupported URI scheme: {uri.scheme}")
raise ValueError(f"Unsupported URI scheme: {uri.scheme}") raise ValueError(f"Unsupported URI scheme: {uri.scheme}")
path = str(uri).replace("memo://", "") # Changed to match new URI format path = str(uri).replace("memo://", "")
if not path or path != "insights": if not path or path != "insights":
logger.error(f"Unknown resource path: {path}") logger.error(f"Unknown resource path: {path}")
raise ValueError(f"Unknown resource path: {path}") raise ValueError(f"Unknown resource path: {path}")
@@ -225,22 +136,6 @@ class McpServer(Server):
if name != "mcp-demo": if name != "mcp-demo":
logger.error(f"Unknown prompt: {name}") logger.error(f"Unknown prompt: {name}")
raise ValueError(f"Unknown prompt: {name}") raise ValueError(f"Unknown prompt: {name}")
<<<<<<< HEAD
notes = (
"<notes>\n"
+ "\n".join(
f"<note name='{name}'>\n{content}\n</note>"
for name, content in self._get_notes().items()
)
+ "\n</notes>"
)
style = (arguments or {}).get("style", "simple")
prompt = """
Your task is to provide a summary of the notes provided below.
{notes}
Ensure that the summary is in {style} style.
""".format(notes=notes, style=style)
=======
if not arguments or "topic" not in arguments: if not arguments or "topic" not in arguments:
logger.error("Missing required argument: topic") logger.error("Missing required argument: topic")
@@ -329,7 +224,6 @@ class McpServer(Server):
""".format(topic=topic) """.format(topic=topic)
logger.debug(f"Generated prompt template for topic: {topic}") logger.debug(f"Generated prompt template for topic: {topic}")
>>>>>>> 67b071f (new SQLite server for demo and Getting started guide. Added contributing.md and pull_request_template.md)
return types.GetPromptResult( return types.GetPromptResult(
description=f"Demo template for {topic}", description=f"Demo template for {topic}",
messages=[ messages=[
@@ -438,7 +332,7 @@ class McpServer(Server):
memo = self._synthesize_memo() memo = self._synthesize_memo()
# Notify clients that the memo resource has changed # Notify clients that the memo resource has changed
await self.request_context.session.send_resource_updated("memo://insights") # Changed from memo:///insights await self.request_context.session.send_resource_updated("memo://insights")
return [types.TextContent(type="text", text="Insight added to memo")] return [types.TextContent(type="text", text="Insight added to memo")]
if not arguments: if not arguments:
@@ -470,9 +364,9 @@ class McpServer(Server):
except Exception as e: except Exception as e:
return [types.TextContent(type="text", text=f"Error: {str(e)}")] return [types.TextContent(type="text", text=f"Error: {str(e)}")]
async def main(db_path: str, anthropic_api_key: str | None = None): async def main(db_path: str):
logger.info(f"Starting SQLite MCP Server with DB path: {db_path}") logger.info(f"Starting SQLite MCP Server with DB path: {db_path}")
server = McpServer(db_path, anthropic_api_key) server = McpServer(db_path)
async with mcp.server.stdio.stdio_server() as (read_stream, write_stream): async with mcp.server.stdio.stdio_server() as (read_stream, write_stream):
logger.info("Server running with stdio transport") logger.info("Server running with stdio transport")
@@ -485,8 +379,7 @@ async def main(db_path: str, anthropic_api_key: str | None = None):
capabilities=server.get_capabilities( capabilities=server.get_capabilities(
notification_options=NotificationOptions(), notification_options=NotificationOptions(),
experimental_capabilities={ experimental_capabilities={
"anthropic_api_key": {"key": anthropic_api_key} },
} if anthropic_api_key else {},
), ),
), ),
) )

77
src/sqlite/uv.lock generated
View File

@@ -10,24 +10,6 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643 }, { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643 },
] ]
[[package]]
name = "anthropic"
version = "0.39.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "anyio" },
{ name = "distro" },
{ name = "httpx" },
{ name = "jiter" },
{ name = "pydantic" },
{ name = "sniffio" },
{ name = "typing-extensions" },
]
sdist = { url = "https://files.pythonhosted.org/packages/79/02/2ea51930009d7537c4648f51d1bb3202ec76704cbb39a2a863ab38bee3dd/anthropic-0.39.0.tar.gz", hash = "sha256:94671cc80765f9ce693f76d63a97ee9bef4c2d6063c044e983d21a2e262f63ba", size = 189339 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/94/61/2580eaa171cab20708d59d39cadd15f78a6c617759e8d0a12e18fe3302d1/anthropic-0.39.0-py3-none-any.whl", hash = "sha256:ea17093ae0ce0e1768b0c46501d6086b5bcd74ff39d68cd2d6396374e9de7c09", size = 198392 },
]
[[package]] [[package]]
name = "anyio" name = "anyio"
version = "4.6.2.post1" version = "4.6.2.post1"
@@ -71,15 +53,6 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 }, { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 },
] ]
[[package]]
name = "distro"
version = "1.9.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/fc/f8/98eea607f65de6527f8a2e8885fc8015d3e6f5775df186e443e0964a11c3/distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed", size = 60722 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2", size = 20277 },
]
[[package]] [[package]]
name = "h11" name = "h11"
version = "0.14.0" version = "0.14.0"
@@ -136,50 +109,6 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 }, { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 },
] ]
[[package]]
name = "jiter"
version = "0.7.1"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/46/e5/50ff23c9bba2722d2f0f55ba51e57f7cbab9a4be758e6b9b263ef51e6024/jiter-0.7.1.tar.gz", hash = "sha256:448cf4f74f7363c34cdef26214da527e8eeffd88ba06d0b80b485ad0667baf5d", size = 162334 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/26/e5/18b30b3015ae1df916cadd42b428f9a47a7277a52b041e4caf939e6c3c21/jiter-0.7.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:ad04a23a91f3d10d69d6c87a5f4471b61c2c5cd6e112e85136594a02043f462c", size = 291198 },
{ url = "https://files.pythonhosted.org/packages/7d/e3/a70e5b98602d24c617e829d6714b3e4f7f9912fdc2844682653dafb5eba0/jiter-0.7.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e47a554de88dff701226bb5722b7f1b6bccd0b98f1748459b7e56acac2707a5", size = 303513 },
{ url = "https://files.pythonhosted.org/packages/34/35/c44064c12e2d189dd3a6135e3b4f9f64167d81abada4eeb0dd75313ad9ad/jiter-0.7.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e44fff69c814a2e96a20b4ecee3e2365e9b15cf5fe4e00869d18396daa91dab", size = 328470 },
{ url = "https://files.pythonhosted.org/packages/de/88/55747df3d3472a08d25ab59752cc7a2682c9bfb38d8dbe00d5fadc35ae49/jiter-0.7.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:df0a1d05081541b45743c965436f8b5a1048d6fd726e4a030113a2699a6046ea", size = 347484 },
{ url = "https://files.pythonhosted.org/packages/8e/f6/afa8d156b7c166dceae66e01d0aa9933f7c3afcc5af3901e717237e5b98c/jiter-0.7.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f22cf8f236a645cb6d8ffe2a64edb5d2b66fb148bf7c75eea0cb36d17014a7bc", size = 373483 },
{ url = "https://files.pythonhosted.org/packages/b7/ab/38c652c71bfd7a8e00fc0962a6985186e9741cfd9dde00a0d8c0138a9c07/jiter-0.7.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:da8589f50b728ea4bf22e0632eefa125c8aa9c38ed202a5ee6ca371f05eeb3ff", size = 390563 },
{ url = "https://files.pythonhosted.org/packages/62/02/1dacf3b95d13f36298a261723c52b45701db485ee104f7677cb931697395/jiter-0.7.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f20de711224f2ca2dbb166a8d512f6ff48c9c38cc06b51f796520eb4722cc2ce", size = 325508 },
{ url = "https://files.pythonhosted.org/packages/b9/a8/ac3509099030304b28c226b432347f5420297e8bec4cb1f27f716a4f23cf/jiter-0.7.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8a9803396032117b85ec8cbf008a54590644a062fedd0425cbdb95e4b2b60479", size = 365355 },
{ url = "https://files.pythonhosted.org/packages/92/fe/85fc2dd31473bf71b1e78311d09bb1f90211b5b327b9b884684d45e9ae48/jiter-0.7.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3d8bae77c82741032e9d89a4026479061aba6e646de3bf5f2fc1ae2bbd9d06e0", size = 514802 },
{ url = "https://files.pythonhosted.org/packages/06/8c/fa1f8b98618b476c346ad57e9eb85293cd2acd7680926b2f27f884c7aebc/jiter-0.7.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3dc9939e576bbc68c813fc82f6620353ed68c194c7bcf3d58dc822591ec12490", size = 497983 },
{ url = "https://files.pythonhosted.org/packages/ee/13/0e726eaee6c5dcd14582d28e90a1381ff4ab1c6b583e597f4e0d4a0950bd/jiter-0.7.1-cp311-none-win32.whl", hash = "sha256:f7605d24cd6fab156ec89e7924578e21604feee9c4f1e9da34d8b67f63e54892", size = 198800 },
{ url = "https://files.pythonhosted.org/packages/2b/30/6a79fd25f36660cec4fb46c5fd0d52375584fdc7a874889b24111cb666af/jiter-0.7.1-cp311-none-win_amd64.whl", hash = "sha256:f3ea649e7751a1a29ea5ecc03c4ada0a833846c59c6da75d747899f9b48b7282", size = 203785 },
{ url = "https://files.pythonhosted.org/packages/10/b3/de89eae8f57dc0ee5f6e3aa1ffcdee0364ef9ef85be81006fd17d7710ffa/jiter-0.7.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:ad36a1155cbd92e7a084a568f7dc6023497df781adf2390c345dd77a120905ca", size = 291900 },
{ url = "https://files.pythonhosted.org/packages/c0/ff/0d804eff4751fceeabc6311d4b07e956daa06fa58f05931887dc7454466b/jiter-0.7.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7ba52e6aaed2dc5c81a3d9b5e4ab95b039c4592c66ac973879ba57c3506492bb", size = 304390 },
{ url = "https://files.pythonhosted.org/packages/e8/26/c258bef532d113a7ac26242893fc9760040a4846dec731098b7f5ac3fca7/jiter-0.7.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2b7de0b6f6728b678540c7927587e23f715284596724be203af952418acb8a2d", size = 328710 },
{ url = "https://files.pythonhosted.org/packages/71/92/644dc215cbb9816112e28f3b43a8c8e769f083434a05fc3afd269c444f51/jiter-0.7.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9463b62bd53c2fb85529c700c6a3beb2ee54fde8bef714b150601616dcb184a6", size = 347569 },
{ url = "https://files.pythonhosted.org/packages/c6/02/795a3535262c54595bd97e375cc03b443717febb37723a7f9c077049825b/jiter-0.7.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:627164ec01d28af56e1f549da84caf0fe06da3880ebc7b7ee1ca15df106ae172", size = 373641 },
{ url = "https://files.pythonhosted.org/packages/7d/35/c7e9a06a49116e3618954f6c8a26816a7959c0f9e5617b0073e4145c5d6d/jiter-0.7.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:25d0e5bf64e368b0aa9e0a559c3ab2f9b67e35fe7269e8a0d81f48bbd10e8963", size = 388828 },
{ url = "https://files.pythonhosted.org/packages/fb/05/894144e4cbc1b9d46756db512268a90f84fc1d8bd28f1a17e0fef5aaf5c5/jiter-0.7.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c244261306f08f8008b3087059601997016549cb8bb23cf4317a4827f07b7d74", size = 325511 },
{ url = "https://files.pythonhosted.org/packages/19/d3/e6674ac34de53787504e4fb309084f824df321f24113121d94bf53808be3/jiter-0.7.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7ded4e4b75b68b843b7cea5cd7c55f738c20e1394c68c2cb10adb655526c5f1b", size = 365940 },
{ url = "https://files.pythonhosted.org/packages/e9/ca/c773f0ce186090cc69a2c97b8dab3dad14ae9988a657a20d879458a8407e/jiter-0.7.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:80dae4f1889b9d09e5f4de6b58c490d9c8ce7730e35e0b8643ab62b1538f095c", size = 515430 },
{ url = "https://files.pythonhosted.org/packages/16/5f/c98f6e6362fbc7c87ad384ba8506983fca9bb55ea0af7efcb23e7dd22817/jiter-0.7.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5970cf8ec943b51bce7f4b98d2e1ed3ada170c2a789e2db3cb484486591a176a", size = 497389 },
{ url = "https://files.pythonhosted.org/packages/30/60/f60e12469afc9096bac3df0fda53de707ed5105d84322a0d1bc4ad03ee3e/jiter-0.7.1-cp312-none-win32.whl", hash = "sha256:701d90220d6ecb3125d46853c8ca8a5bc158de8c49af60fd706475a49fee157e", size = 198546 },
{ url = "https://files.pythonhosted.org/packages/01/d2/d8ec257544f7991384a46fccee6abdc5065cfede26354bb2c86251858a92/jiter-0.7.1-cp312-none-win_amd64.whl", hash = "sha256:7824c3ecf9ecf3321c37f4e4d4411aad49c666ee5bc2a937071bdd80917e4533", size = 202792 },
{ url = "https://files.pythonhosted.org/packages/b5/cf/00a93a9968fc21b9ecfcabb130a8c822138594ac4a00b7bff9cbb38daa7f/jiter-0.7.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:097676a37778ba3c80cb53f34abd6943ceb0848263c21bf423ae98b090f6c6ba", size = 291039 },
{ url = "https://files.pythonhosted.org/packages/22/9a/0eb3eddffeca703f6adaaf117ba93ac3336fb323206259a86c2993cec9ad/jiter-0.7.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3298af506d4271257c0a8f48668b0f47048d69351675dd8500f22420d4eec378", size = 302468 },
{ url = "https://files.pythonhosted.org/packages/b1/95/b4da75e93752edfd6dd0df8f7723a6575e8a8bdce2e82f4458eb5564936a/jiter-0.7.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:12fd88cfe6067e2199964839c19bd2b422ca3fd792949b8f44bb8a4e7d21946a", size = 328401 },
{ url = "https://files.pythonhosted.org/packages/28/af/7fa53804a2e7e309ce66822c9484fd7d4f8ef452be3937aab8a93a82c54b/jiter-0.7.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:dacca921efcd21939123c8ea8883a54b9fa7f6545c8019ffcf4f762985b6d0c8", size = 347237 },
{ url = "https://files.pythonhosted.org/packages/30/0c/0b89bd3dce7d330d8ee878b0a95899b73e30cb55d2b2c41998276350d4a0/jiter-0.7.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de3674a5fe1f6713a746d25ad9c32cd32fadc824e64b9d6159b3b34fd9134143", size = 373558 },
{ url = "https://files.pythonhosted.org/packages/24/96/c75633b99d57dd8b8457f88f51201805c93b314e369fba69829d726bc2a5/jiter-0.7.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65df9dbae6d67e0788a05b4bad5706ad40f6f911e0137eb416b9eead6ba6f044", size = 388251 },
{ url = "https://files.pythonhosted.org/packages/64/39/369e6ff198003f55acfcdb58169c774473082d3303cddcd24334af534c4e/jiter-0.7.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ba9a358d59a0a55cccaa4957e6ae10b1a25ffdabda863c0343c51817610501d", size = 325020 },
{ url = "https://files.pythonhosted.org/packages/80/26/0c386fa233a78997db5fa7b362e6f35a37d2656d09e521b0600f29933992/jiter-0.7.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:576eb0f0c6207e9ede2b11ec01d9c2182973986514f9c60bc3b3b5d5798c8f50", size = 365211 },
{ url = "https://files.pythonhosted.org/packages/21/4e/bfebe799924a39f181874b5e9041b792ee67768a8b160814e016a7c9a40d/jiter-0.7.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:e550e29cdf3577d2c970a18f3959e6b8646fd60ef1b0507e5947dc73703b5627", size = 514904 },
{ url = "https://files.pythonhosted.org/packages/a7/81/b3c72c6691acd29cf707df1a0b300e6726385b3c1ced8dc20424c4452699/jiter-0.7.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:81d968dbf3ce0db2e0e4dec6b0a0d5d94f846ee84caf779b07cab49f5325ae43", size = 497102 },
{ url = "https://files.pythonhosted.org/packages/1e/c3/766f9ec97df0441597878c7949da2b241a12a381c3affa7ca761734c8c74/jiter-0.7.1-cp313-none-win32.whl", hash = "sha256:f892e547e6e79a1506eb571a676cf2f480a4533675f834e9ae98de84f9b941ac", size = 198119 },
{ url = "https://files.pythonhosted.org/packages/76/01/cbc0136784a3ffefb5ca5326f8167780c5c3de0c81b6b81b773a973c571e/jiter-0.7.1-cp313-none-win_amd64.whl", hash = "sha256:0302f0940b1455b2a7fb0409b8d5b31183db70d2b07fd177906d83bf941385d1", size = 199236 },
]
[[package]] [[package]]
name = "mcp" name = "mcp"
version = "0.9.1" version = "0.9.1"
@@ -278,15 +207,11 @@ name = "sqlite"
version = "0.1.0" version = "0.1.0"
source = { editable = "." } source = { editable = "." }
dependencies = [ dependencies = [
{ name = "anthropic" },
{ name = "mcp" }, { name = "mcp" },
] ]
[package.metadata] [package.metadata]
requires-dist = [ requires-dist = [{ name = "mcp", specifier = ">=0.9.1" }]
{ name = "anthropic", specifier = ">=0.39.0" },
{ name = "mcp", specifier = ">=0.9.1" },
]
[[package]] [[package]]
name = "sse-starlette" name = "sse-starlette"