QueryForge
streamlit-dashboard-mcpserver
QueryForge — 데이터베이스에 말을 걸어 보세요. 대시보드로 변하는 모습을 지켜보세요.
Claude가 SQLite 데이터베이스에 쿼리하고, 지식 베이스에서 기업별 비즈니스 로직을 검색하고, 실시간 Streamlit 대시보드를 만들 수 있게 해주는 통합 Model Context Protocol 서버입니다. 모든 것이 단일 대화에서 이루어집니다.
프로젝트 구조
streamlit-dashboard-mcpserver/
├── .venv/ # Python virtual environment (managed by uv)
├── data/
│ ├── seed.py # Generates the sample CRM database
│ └── database.db # SQLite database (generated by seed.py)
├── knowledge_base/
│ ├── docs/ # Source documents (formulas, business rules, definitions)
│ ├── ingest.py # Chunks + embeds docs into the vector store
│ └── index/ # Persisted vector store (generated by ingest.py)
├── .python-version # Pinned Python version for uv
├── dashboard.py # Auto-generated by Claude at runtime
├── server.py # The MCP server
├── uv.lock # Dependency lock file
└── README.mdRelated MCP server: TheMCP-server
기능
도구 | 설명 |
| 데이터베이스의 모든 테이블 나열 |
| 테이블의 열, 유형, 제약 조건 표시 |
| 모든 테이블의 처음 N개 행 반환 |
| 읽기 전용 SELECT 쿼리 실행 |
| 기업 문서(사용자 정의 계산 공식, 비즈니스 규칙, 지표 정의)에서 관련 청크를 검색하여 Claude가 올바른 쿼리와 대시보드 로직을 작성하도록 지원 |
| Streamlit 앱 작성, 종속성 자동 설치 및 실행 |
| 실행 중인 Streamlit 프로세스 중지 |
| 대시보드 실행 여부와 포트 확인 |
| 현재 dashboard.py 소스 읽기 |
읽기 전용 강제 적용. INSERT, UPDATE, DELETE, DROP 및 기타 모든 쓰기 작업은 서버 수준에서 차단됩니다. 지식 베이스는 검색 전용입니다 — Claude는 이 서버를 통해 지식 베이스에 다시 쓸 수 없습니다.
query_knowledge_base는 대시보드를 단순히 그럴듯하게 만드는 것이 아니라 정확하게 만드는 핵심입니다. "순매출"이나 "활성 고객"과 같은 용어를 조직에서 어떻게 정의하는지 추측하는 대신, Claude는 SQL이나 대시보드 코드를 작성하기 전에 청크로 분할된 기업 문서에서 실제 문서화된 공식을 검색합니다.

사전 요구 사항
Python 3.11+ (
.python-version으로 고정)uv — 이 프로젝트에서 이미 사용 중 (
uv.lock참조)Claude Desktop
지식 베이스용 원본 문서 폴더 (PDF, Markdown 또는 일반 텍스트 — 예: 내부 공식 시트, 지표 용어집 또는 SOP)
설치
1. Claude Desktop 설치
운영 체제에 맞는 Claude Desktop을 다운로드하여 설치합니다: Windows / macOS: https://claude.ai/download 설치 후 Anthropic 계정으로 로그인합니다.
2. 저장소 클론
HTTPS:
git clone https://github.com/your-username/streamlit-dashboard-mcpserver.git
cd streamlit-dashboard-mcpserverSSH:
git clone git@github.com:your-username/streamlit-dashboard-mcpserver.git
cd streamlit-dashboard-mcpserverGitHub CLI:
gh repo clone your-username/streamlit-dashboard-mcpserver
cd streamlit-dashboard-mcpserver3. uv로 환경 설정
이 프로젝트는 환경 관리를 위해 uv를 사용합니다. .python-version과 uv.lock 파일이 이미 커밋되어 있으므로, 설정은 단일 명령으로 완료됩니다.
uv가 없다면 설치합니다:
# Windows (PowerShell)
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"가상 환경을 만들고 잠금 파일에서 모든 종속성을 설치합니다:
uv sync환경을 활성화합니다:
# Windows PowerShell
.venv\Scripts\Activate.ps1
# Windows CMD
.venv\Scripts\activate.bat활성화되면 프롬프트에 프로젝트 이름이 표시됩니다:
(streamlit-dashboard-mcpserver) PS C:\Users\benij\ds_project\streamlit-dashboard-mcpserver>핵심 패키지가 설치되었는지 확인합니다:
pip list | findstr "mcp streamlit"누락된 것이 있다면:
uv pip install mcp streamlit pandas plotly4. 데이터베이스 생성
data/ 안의 seed.py 스크립트는 전체 스노우플레이크 스키마에 걸쳐 10,000개 이상의 레코드가 있는 현실적인 CRM 데이터베이스를 생성합니다.
cd data
python seed.py
cd ..이렇게 하면 MCP 서버가 읽는 data/database.db가 생성됩니다.
5. 지식 베이스 인덱스 구축
기업 문서(공식 시트, 지표 정의, 비즈니스 규칙 — PDF, Markdown 또는 .txt)를 knowledge_base/docs/에 넣은 후 다음을 실행합니다:
python knowledge_base/ingest.py이 명령은 문서를 청크로 분할하고 임베딩한 후 결과 벡터 저장소를 knowledge_base/index/에 기록합니다. 이것이 런타임에 query_knowledge_base가 읽는 대상입니다 — 원본 문서가 변경될 때마다 이 스크립트를 다시 실행하세요.
6. Claude Desktop 구성
Claude Desktop은 JSON 구성 파일에서 MCP 서버 정의를 읽습니다.
구성 파일을 엽니다:
notepad $env:APPDATA\Claude\claude_desktop_config.json파일이 아직 없으면 메모장에서 생성 여부를 묻습니다 — 예를 클릭합니다.
다음 구성을 붙여넣고, benij를 Windows 사용자 이름이 다르다면 해당 이름으로 바꿉니다:
{
"mcpServers": {
"sqlite-dashboard": {
"command": "C:\\Users\\benij\\ds_project\\streamlit-dashboard-mcpserver\\.venv\\Scripts\\python.exe",
"args": [
"C:\\Users\\benij\\ds_project\\streamlit-dashboard-mcpserver\\server.py"
],
"env": {
"DB_PATH": "C:\\Users\\benij\\ds_project\\streamlit-dashboard-mcpserver\\data\\database.db",
"DASHBOARD_PORT": "8501",
"KB_INDEX_PATH": "C:\\Users\\benij\\ds_project\\streamlit-dashboard-mcpserver\\knowledge_base\\index"
}
}
}
}정확한 Python 경로를 확인하려면 venv가 활성화된 상태에서 다음을 실행합니다:
where.exe python예상 출력:
C:\Users\benij\ds_project\streamlit-dashboard-mcpserver\.venv\Scripts\python.exe해당 정확한 문자열을 구성의 command 값으로 사용합니다.
항상 절대 경로를 사용하세요. Claude Desktop은 예측할 수 없는 작업 디렉터리에서 MCP 서버를 하위 프로세스로 실행합니다 — 상대 경로는 올바르게 해석되지 않습니다.
7. Claude Desktop 재시작
구성을 저장한 후 Claude Desktop을 완전히 종료합니다 — 시스템 트레이 아이콘을 마우스 오른쪽 버튼으로 클릭 → 종료. 그런 다음 다시 엽니다.
재시작되면 채팅 입력란 왼쪽 하단의 🔨 망치 아이콘을 클릭합니다. 9개 도구가 모두 나열되어 서버가 연결되었음을 확인할 수 있습니다.
사용법
연결이 완료되면 Claude에게 자연스럽게 말을 겁니다:
"What tables are in my database?"
"How do we define 'net revenue' internally?"
"Show me the top 10 customers by total revenue, using our
company's official revenue formula"
"Build a dashboard with monthly sales trends, a bar chart
by product category, and a salesperson leaderboard"Claude는 스키마를 탐색하고, 필요할 때 지식 베이스에서 관련 비즈니스 로직을 가져오고, 쿼리를 실행하고, Streamlit 코드를 작성하고, 누락된 종속성을 설치한 후 브라우저에서 열 URL — 기본적으로 http://localhost:8501 — 을 반환합니다.
환경 변수
claude_desktop_config.json의 env 블록에 다음을 설정합니다:
변수 | 기본값 | 설명 |
|
| SQLite 데이터베이스의 절대 경로 |
|
| Streamlit이 수신할 포트 |
|
|
|
문제 해결
🔨 Claude Desktop에 망치 아이콘이 표시되지 않음 구성 JSON이 유효하지 않을 가능성이 높습니다 — 후행 쉼표와 괄호 불일치가 흔한 실수입니다. jsonlint.com에 붙여넣어 검증하세요. 구성 변경 후에는 항상 Claude Desktop을 완전히 종료하고 다시 여세요.
"Database not found" 오류
DB_PATH가 절대 경로이고 database.db가 data/ 폴더 안에 존재하는지 확인하세요. 아직 생성되지 않았다면 seed.py를 실행하세요.
query_knowledge_base가 결과를 반환하지 않음 / 빈 인덱스
knowledge_base/docs/에 실제로 문서가 있는지 확인한 후 python knowledge_base/ingest.py를 다시 실행하세요. 구성의 KB_INDEX_PATH가 knowledge_base/index/를 가리키는지 확인하세요.
Streamlit 페이지가 로드되지 않음
Claude에게 "대시보드가 실행 중인가요?"라고 물어 get_dashboard_status를 호출하세요. 실행 중이 아니라면 Claude에게 create_dashboard를 다시 요청하세요. 또한 포트 8501이 다른 프로세스에 의해 이미 사용 중인지 확인하세요.
uv sync 실패
설치된 Python 버전이 .python-version과 일치하는지 확인하세요. python --version으로 확인하고, 필요하면 python.org에서 올바른 버전을 설치하세요.
.venv 활성화 시 PowerShell ExecutionPolicy 오류
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser그런 다음 다시 활성화하세요.
소개
자연어를 SQL 쿼리와 실시간 비즈니스 로직 인식 Streamlit 대시보드로 변환하는 MCP 서버입니다. Claude와 기업별 규칙 및 공식의 검색 증강 지식 베이스로 구동됩니다.
Available Tools
10 toolscreate_dashboardB
Creates or updates the Streamlit dashboard with the given Python code.
Automatically installs missing dependencies and starts/reloads the app.
IMPORTANT: The variable DB_PATH is automatically injected at the top of
your code — always connect to the database using:
conn = sqlite3.connect(DB_PATH)
Never hardcode a database path string yourself.
Args:
code: Full Python source code for the Streamlit dashboard
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations, so the description carries the full load. It discloses helpful side effects (auto-install dependencies, automatic DB_PATH injection) and the create-or-update dual behavior, but omits permission needs, error modes, and whether the update replaces the whole app or merges. Partial behavioral coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action, then the caveat about DB_PATH. The 'Args' block is boilerplate but short. Some redundancy between the first sentence and the later 'starts/reloads the app' clause, but overall efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be explained. The description covers the key constraint (DB_PATH) and high-level behavior, but does not address what happens on failure, dependency install scope, or how to recover a bad deploy, which matters for an agent invoking a code-writing tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the only param is described minimally as 'Full Python source code for the Streamlit dashboard.' The important detail about DB_PATH injection is stated as prose rather than tied to the code parameter, and there is no guidance on structure, length, or modules allowed. With low coverage the description should compensate more.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (creates or updates) and resource (Streamlit dashboard) with the input that drives it (Python code). It does not explicitly contrast with siblings like read_dashboard or stop_dashboard, but the lifecycle role is clear from the phrasing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage through the code argument and the mention of reloading an existing app, but never states when to use this tool versus stop_dashboard/read_dashboard or what prerequisites exist. Usage is inferable rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
describe_tableC
Show column names, types, and constraints for a table.
Args:
table: Name of the table to describe
| Name | Required | Description | Default |
|---|---|---|---|
| table | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden, yet it says nothing about read-only nature, required permissions, or behavior for a nonexistent table. The statement of what is returned (columns, types, constraints) overlaps with the output schema, so it adds little behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose sentence is short and front-loaded with the key information. The appended 'Args:' block is slightly redundant for a one-parameter tool but costs little.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and this is a simple one-parameter read operation. Still, nothing addresses error cases, missing tables, or how this differs from list_tables/sample_table, leaving the definition at the minimum viable level.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, but 'Name of the table to describe' only restates the parameter name. It omits useful detail such as whether a schema qualifier is expected, case sensitivity, or how nested/qualified names are handled.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource ('Show column names, types, and constraints for a table'), so an agent immediately knows it returns schema metadata. It does not, however, distinguish itself from siblings like list_tables or sample_table, which also operate on table metadata.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use guidance and no mention of alternatives such as list_tables (for enumeration) or sample_table (for row data). Usage is only implied by the purpose statement, leaving the agent to infer the boundary between this and its siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_dashboard_statusA
Returns whether the Streamlit dashboard is running and on which port.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden, and it does disclose the essential trait: this is a status/read probe that returns a running flag and a port. It omits any note about authentication, side effects, or what happens when the dashboard is stopped, though for a zero-argument probe that gap is modest.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; the returned information is stated immediately with zero waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so the description needn't enumerate return values, and no parameters need explaining. The only missing piece is when to reach for this tool relative to the other dashboard tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes no parameters, so the baseline of 4 applies; there is no parameter semantics to document. The description correctly adds no redundant parameter commentary.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb and resource ('Returns whether the Streamlit dashboard is running and on which port'), which is specific enough to distinguish it from create_dashboard, stop_dashboard, and read_dashboard. It doesn't explicitly name those siblings, but the status-vs-operate distinction is inherent in the wording.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no guidance on when to call this versus alternatives such as read_dashboard or create_dashboard, and no preconditions. The use case (checking readiness before another dashboard operation) is only inferable, not stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
knowledge_base_infoA
Returns metadata about the current knowledge base:
total chunks, unique sources, collection name, embedding model.
Useful to verify that PDF ingestion completed successfully.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the disclosure burden. It signals a read-style metadata call and what is returned, but says nothing about permissions, behavior on an empty/uninitialized knowledge base, or whether the call has any cost or side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the return payload and followed by the motivating use case. Nothing is padded, though the value could have been sharpened slightly by naming the sibling it contrasts with.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described, and with zero parameters there is no schema gap to compensate for. The only missing element is any note on failure/empty-state behavior in the absence of annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to clarify; the baseline for a parameterless tool applies. The description adds no spurious parameter-like claims.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Uses a specific verb (returns) with a specific resource (knowledge base) and enumerates the returned metadata: total chunks, unique sources, collection name, embedding model. This clearly separates it from the search-oriented sibling knowledge_search, though it never names that sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit purpose context: verifying that PDF ingestion completed successfully. It does not state when not to use it or point to an alternative, so it falls short of full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
knowledge_searchA
Semantic search over the ingested PDF knowledge base.
Pipeline:
1. Bi-encoder retrieval from ChromaDB (fast ANN search, top_k_retrieve candidates)
2. Cross-encoder reranking (precise pointwise scoring)
3. Custom composite metric computation (cosine + rerank + keyword + density)
4. Returns top_k_return chunks ranked by composite score with full metrics
The composite_score field is the primary relevance signal you should use when
deciding how much to trust each chunk. Scores > 0.7 are highly relevant.
Args:
query: Natural-language question or search phrase
top_k_retrieve: Number of candidates to fetch from the vector DB (default 20)
top_k_return: Number of final results to return after reranking (default 5)
filter_source: Optional — filter by PDF filename (e.g. "report.pdf")
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | ||
| top_k_return | No | ||
| filter_source | No | ||
| top_k_retrieve | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations, so the description carries the full burden, and it does substantial work: it discloses the retrieval/rerank/composite-score pipeline, how the composite_score should be interpreted (>0.7 highly relevant), and what the return contains. It stops short of describing permissions, latency/cost, or what happens on an empty KB.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well front-loaded: one-line purpose, then a numbered pipeline, then score interpretation, then args. Slightly verbose and the numbered pipeline is borderline display-oriented, but every section earns its place for a multi-stage tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values needn't be enumerated, and the description still adds the key interpretation rule. Combined with full param semantics and pipeline disclosure, it is complete for correct invocation; only cross-sibling routing guidance is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does: it gives meaning, format and defaults for all four args, and explains the retrieve-vs-return relationship (candidate fetch vs final reranked results) plus a concrete filter_source example.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource+scope: 'Semantic search over the ingested PDF knowledge base.' The pipeline detail makes it unambiguous, and it is clearly distinguished from siblings like query_database (SQL) or knowledge_base_info (metadata).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implied usage is clear (natural-language semantic lookup over PDFs), but there is no explicit when-to-use / when-not guidance and no named alternative such as query_database for structured questions. The description doesn't route the agent among siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_tablesA
List all tables in the SQLite database.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It only states the purpose but does not disclose any behavioral traits like read-only nature or performance implications, though the operation is obviously safe.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise (five words) and front-loaded, containing no unnecessary information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given zero parameters and a presumably simple output schema, the description is sufficient. It could mention that it returns table names, but the output schema likely covers that.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has no parameters and schema coverage is 100%, so the description does not need to add parameter info. It appropriately omits such details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states the action ('List') and the resource ('all tables in the SQLite database'), which is specific and clearly distinguishes from siblings like 'execute' or 'query'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use (to get all tables), but does not provide explicit guidance on when not to use or mention alternatives. For a simple tool, this is acceptable but lacks some clarity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_databaseB
Run a SELECT query against the SQLite database.
Only read-only SELECT statements are allowed.
Args:
sql: A valid SQLite SELECT statement
| Name | Required | Description | Default |
|---|---|---|---|
| sql | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and partially meets it by disclosing the read-only constraint ('Only read-only SELECT statements are allowed'). It does not cover error handling for non-SELECT input, permissions, or other runtime behavior, so the disclosure is useful but incomplete.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loaded: purpose first, then the key constraint, then the argument. The Args section slightly repeats the SELECT requirement from the opening line, but the overall size is appropriate with minimal waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple (one parameter) and an output schema exists, so the description need not explain return values. It covers purpose, the read-only constraint, and the parameter meaning, which is nearly sufficient; the main gap is the lack of sibling routing guidance, but that is a minor omission given the tool's straightforward scope.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It does add meaning by specifying the parameter must be a valid SQLite SELECT statement (not arbitrary SQL), but it offers no detail on result handling, parameter binding, or syntax expectations beyond that. Partial compensation, not full.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Run') and resource ('SELECT query against the SQLite database'), making the tool's function clear. It does not explicitly distinguish itself from read-oriented siblings like list_tables or sample_table, but the 'arbitrary SELECT' scope is implied well enough for an agent to infer it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description only says 'Only read-only SELECT statements are allowed' — a hard constraint, not usage guidance. It gives no indication of when to use query_database versus list_tables, describe_table, or sample_table, leaving the agent to infer routing on its own.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_dashboardB
Returns the current contents of dashboard.py.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It implies a safe, live read via 'current', but says nothing about what happens when the dashboard does not exist, permissions, or side effects. The output schema covers return values, but behavioral gaps remain.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short sentence with the resource stated first and no filler. Every word earns its place and nothing is buried.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple (0 params, output schema present), so the description need not explain returns. However, it omits error behavior and any routing hint against its many siblings, leaving the definition minimally adequate rather than complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so per the baseline this scores 4. There is nothing for the description to disambiguate, and it correctly does not invent parameter detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb (returns) tied to a concrete resource (the contents of dashboard.py), so an agent knows this is a plain read of a file. It does not explicitly differentiate itself from siblings like get_dashboard_status, but the read-vs-status distinction is mostly inferable from the verb.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to use this tool versus the many siblings (create_dashboard, stop_dashboard, get_dashboard_status). Usage is only implied by the word 'Returns', with no conditions, prerequisites, or alternatives named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sample_tableB
Return the first N rows of a table (default 5, max 50).
Args:
table: Name of the table to sample
limit: Number of rows to return (default 5, max 50)
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| table | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It usefully discloses the default (5) and hard cap (max 50), but says nothing about row ordering (i.e., that 'first N' may be arbitrary without an ORDER BY), required permissions, or whether this is strictly read-only. The cap is the main behavioral fact conveyed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose line is front-loaded and the Args block is compact. The default/max values are repeated in both the opening sentence and the args list, which is mild redundancy but acceptable given the schema has no descriptions.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described. For a simple two-parameter read tool, the description covers purpose, both arguments, and the size constraint adequately; it only lacks sibling disambiguation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does: both parameters are explained ('table: Name of the table to sample' and 'limit: Number of rows to return (default 5, max 50)'), including the default and constraint. Minor gap in that table-name qualification conventions (schema/catalog prefixes) are not addressed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Return the first N rows of a table'), which clearly conveys a sampling operation. It does not, however, differentiate itself from siblings like query_database or describe_table, so an agent must infer the distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus query_database, describe_table, or list_tables, all of which are plausible alternatives for inspecting a table. No exclusions, prerequisites, or situational context are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
stop_dashboardB
Stops the running Streamlit dashboard process.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden, yet it only asserts that a process is stopped. It does not disclose whether the operation is idempotent when nothing is running, whether it terminates the process forcibly or gracefully, whether any session state or data is lost, or what permissions are needed for a mutation-style action.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single compact sentence with the action front-loaded and no filler. It is efficient, though it is arguably too terse for a lifecycle-mutating action, leaving room for a short usage clause without bloat.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value explanation is not required, and the zero-parameter schema is simple. However, with no annotations and a lifecycle-mutating operation, the description omits the prerequisite state and side effects an agent would need to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate and the baseline is 4. The schema confirms an empty argument object, matching the description's lack of parameter discussion.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ("Stops") and resource ("the running Streamlit dashboard process"), which is unambiguous on its own. It contrasts implicitly with create_dashboard, get_dashboard_status, and read_dashboard by naming the lifecycle action, but never explicitly says how it differs from its siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives such as get_dashboard_status (which would tell you whether a dashboard is running) or create_dashboard. The phrase "the running" implies a precondition but does not state what happens if no dashboard is running or when to prefer this over a status check.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
10 tool updates
v0.1.0- First observed
create_dashboard - First observed
describe_table - First observed
get_dashboard_status - First observed
knowledge_base_info - First observed
knowledge_search - First observed
list_tables - First observed
query_database - First observed
read_dashboard - First observed
sample_table - First observed
stop_dashboard
TDQS
Scored across 10 tools
Each tool targets a distinct resource and action: table introspection (list/describe/sample), read-only querying, dashboard lifecycle management, and knowledge-base retrieval. Boundaries are clear, and the read-only query tool is explicitly separated from the preview/schema helpers.
Most tools use a predictable verb_noun pattern (list_tables, describe_table, sample_table, query_database, create_dashboard, stop_dashboard, read_dashboard). However knowledge_search and knowledge_base_info flip to a noun_verb/compound form, a minor deviation from the dominant convention.
Ten tools is well-scoped, and each earns its place within its functional group. It does span three distinct concerns (SQLite querying, Streamlit dashboard, knowledge base), which is slightly broad but still justified.
Dashboard lifecycle (create/stop/status/read) and table exploration plus read-only querying are well covered. Gaps exist: there is no knowledge-base ingestion tool despite referring to an ingested KB, and no way to modify or delete data.
Maintenance
Related MCP Connectors
MCP server unifying ERPs, CRMs, APIs and knowledge base for Claude, ChatGPT and Gemini.
Hosted SQL Server MCP server for Claude, ChatGPT and Cursor, with each action switched per account.
Query your warehouse or a CSV with Claude/ChatGPT over MCP, governed by table-level ACL + audit.
Text-to-SQL MCP server: read-only queries on PostgreSQL, MySQL and SQL Server with your real schema
Related MCP Servers
- AlicenseAqualityAmaintenanceOne config, one CLI that turns your databases (Postgres, MySQL, SQLite, MongoDB) into MCP servers for Claude, GPT, Cursor, and any MCP-compatible agent.31MIT
- FlicenseNot gradedqualityDmaintenanceEnables interaction with SQLite databases, filesystem, AWS IAM, and Gmail through a master MCP server with a Streamlit UI optimized for Claude.1-
- AlicenseAqualityDmaintenanceMCP server for Claude that connects to MySQL, MariaDB, and SQLite databases. Query your databases using natural language.3MIT
- AlicenseAqualityDmaintenanceA database-agnostic MCP server that enables natural language queries to your database through Claude or Copilot, automatically writing and executing SQL.88 npmMIT