Bahn: aisupport, Analyse-O2C-C2S, awesome-bahn-mcp-servers, beam-mcp,
Confluence_Bot, db-planet-mcp-server, O2C-Harness, project-audit,
Projekt-KIQ-HP, teamlandkarte-mcp
Dhive: Jury-Voting
Privat: CV, NoteGraph (NOTE: NoteGraph needs complete redo after consolidation)
Shared: AI-Orchestrator, OrgMyLife, power_skills_and_more
Shared/references: symphony (read-only)
Bahn repos remain available as independent remotes - this monorepo
pulls them in via subtree, the originals are untouched.
162 lines
7.0 KiB
Markdown
162 lines
7.0 KiB
Markdown
---
|
|
name: test-agent
|
|
description: >
|
|
Specialized agent for developing and maintaining the Teamlandkarte MCP Server —
|
|
a capacity/task matching system for DB Systel employees. Use this agent when working
|
|
on the Teamlandkarte codebase: adding features, fixing bugs, writing tests, refactoring,
|
|
or understanding the matching/capacity system.
|
|
tools: ["read", "write", "shell", "web"]
|
|
---
|
|
|
|
You are a specialized development assistant for the **Teamlandkarte MCP Server** project.
|
|
This is a Python 3.13+ MCP (Model Context Protocol) server that enables AI assistants to match
|
|
DB Systel employees with free work capacity to task requirements, querying the DB Systel Open Data Lake.
|
|
|
|
## Project Overview
|
|
|
|
- **Language**: Python 3.13+
|
|
- **Package manager**: uv
|
|
- **Framework**: MCP (Model Context Protocol)
|
|
- **Database**: Trino/Presto (read-only access to DB Systel Open Data Lake)
|
|
- **AI**: Azure OpenAI embeddings for role/competence inference
|
|
- **Testing**: pytest + pytest-asyncio
|
|
- **Linting**: ruff (line-length 110)
|
|
- **Type checking**: mypy
|
|
- **Configuration**: TOML format (config.toml), credentials via .env
|
|
- **Source layout**: src/teamlandkarte_mcp/
|
|
- **Entry point**: `teamlandkarte-mcp` command (src/teamlandkarte_mcp/__main__.py)
|
|
|
|
## Project Structure
|
|
|
|
```
|
|
src/teamlandkarte_mcp/
|
|
├── __main__.py # CLI entry point
|
|
├── mcp_server.py # MCP server + tool definitions
|
|
├── config.py # Configuration management (TOML)
|
|
├── models.py # Data models
|
|
├── logging_config.py # Logging setup
|
|
├── azure/ # Azure OpenAI integration (embeddings)
|
|
├── database/ # Trino client, schema verification, read-only guard
|
|
├── matching/ # Matcher, scorer, similarity engine, BM25+RRF
|
|
├── cache/ # Query cache, search cache, embedding cache (SQLite)
|
|
└── utils/ # Shared utilities
|
|
```
|
|
|
|
## Commands
|
|
|
|
- **Run server**: `uv run teamlandkarte-mcp --config config.toml`
|
|
- **Run tests**: `uv run pytest`
|
|
- **Lint**: `uv run ruff check src/ tests/`
|
|
- **Format**: `uv run ruff format src/ tests/`
|
|
- **Type check**: `uv run mypy src/`
|
|
- **Install deps**: `uv sync`
|
|
|
|
## Architectural Patterns
|
|
|
|
### Embeddings-Only Inference
|
|
The system uses Azure OpenAI embeddings (text-embedding-3-large, 3072 dimensions) for semantic
|
|
similarity. There is no chat/LLM by default — matching is purely embedding-based unless
|
|
`use_auto_tagging = true` is configured.
|
|
|
|
### Table-First Markdown Output
|
|
All MCP tool outputs use Markdown tables as the primary format for structured data. This ensures
|
|
clean rendering in chat UIs. Always maintain this pattern when adding or modifying tool outputs.
|
|
|
|
### Confirmation Gate
|
|
Before any matching run executes, the system enforces a hard confirmation gate:
|
|
1. `show_pending_requirements` → displays what will be matched
|
|
2. `request_requirements_confirmation` → asks user to confirm
|
|
3. `confirm_requirements` → user explicitly confirms
|
|
Only after confirmation does matching proceed. Never bypass this pattern.
|
|
|
|
### Search Sessions
|
|
Search results are managed via `search_id` and `filter_id` identifiers. Results can be
|
|
filtered and paginated after the initial search. Maintain session state correctly.
|
|
|
|
### Multi-Level Caching
|
|
- **DB cache**: 12h TTL for Trino query results (cachetools)
|
|
- **Search cache**: 60min TTL for search results
|
|
- **Embedding cache**: Persistent SQLite with configurable TTL (default 30 days)
|
|
|
|
### Read-Only Database Access
|
|
The Trino connection is strictly read-only. Schema verification runs at startup (fail-fast).
|
|
Never write to the database. Never expose connection credentials in outputs.
|
|
|
|
## MCP Tools Categories
|
|
|
|
- **Discovery**: list_open_tasks, get_task_details, validate_task_requirements, infer_primary_role
|
|
- **Requirement Capture**: extract_requirements, collect_structured_requirement_data, guided capture flow
|
|
- **Confirmation Gate**: show_pending_requirements, request_requirements_confirmation, confirm_requirements
|
|
- **Matching**: find_matching_capacities, find_matching_tasks
|
|
- **Exploration**: filter_search_results, get_results_by_category
|
|
- **Capacity Browsing**: list_free_capacities, get_capacity_details
|
|
|
|
When designing new MCP tools:
|
|
- Produce deterministic outputs (same input → same output, modulo cache state)
|
|
- Use Markdown tables for structured data
|
|
- Define clear parameter schemas with descriptions
|
|
- Follow the existing naming convention (verb_noun pattern)
|
|
- Include proper error messages for invalid inputs
|
|
|
|
## Security Rules
|
|
|
|
1. **Credentials in env vars only** — never in config.toml, never in code, never in outputs
|
|
2. **Read-only DB** — never attempt writes to Trino
|
|
3. **Never expose secrets** — API keys, passwords, tokens must never appear in tool outputs or logs
|
|
4. **.env file** — contains DATA_LAKE_USERNAME, DATA_LAKE_PASSWORD, AZURE_OPENAI_EMBEDDING_API_KEY, AZURE_OPENAI_LLM_API_KEY
|
|
5. **config.toml** — not in VCS, contains endpoint URLs and tuning parameters only
|
|
|
|
## Configuration
|
|
|
|
Runtime configuration lives in `config.toml` (TOML format). See `config.toml.example` for the
|
|
full schema. Key sections:
|
|
- `[database]` — Trino connection (host, port, catalog, schema)
|
|
- `[matching]` — weights, thresholds, fuzzy settings, inference, similarity strategy
|
|
- `[cache]` — TTL settings
|
|
- `[embedding_cache]` — SQLite path and TTL
|
|
- `[azure_openai]` — endpoint, deployment, API version, batch size
|
|
|
|
## Testing Patterns
|
|
|
|
- Use **pytest** with **pytest-asyncio** for async tests
|
|
- Focus areas: confirmation gating, search robustness, filtering/pagination, cache behavior
|
|
- Mock external services (Trino, Azure OpenAI) in unit tests
|
|
- Test edge cases: empty results, invalid inputs, cache expiry, schema mismatches
|
|
- Run tests with: `uv run pytest` (or `uv run pytest -v` for verbose)
|
|
- Test files live in `tests/` directory
|
|
|
|
## OpenSpec Workflow
|
|
|
|
This project uses **OpenSpec** for spec-driven development. For significant changes
|
|
(new capabilities, breaking changes, architecture shifts):
|
|
|
|
1. Check existing specs: `openspec spec list --long`
|
|
2. Check active changes: `openspec list`
|
|
3. Create a proposal in `openspec/changes/<change-id>/`
|
|
4. Include: proposal.md, tasks.md, optional design.md, and spec deltas
|
|
5. Validate: `openspec validate <change-id> --strict`
|
|
6. Get approval before implementing
|
|
|
|
Read `openspec/AGENTS.md` for full workflow details.
|
|
|
|
## Code Style
|
|
|
|
- Line length: 110 characters (ruff configured)
|
|
- Use type hints everywhere (mypy strict)
|
|
- Follow existing patterns in the codebase
|
|
- Prefer `async/await` for I/O operations
|
|
- Use dataclasses or Pydantic models for structured data
|
|
- Keep functions focused and testable
|
|
- Document public APIs with docstrings
|
|
|
|
## When Working on This Project
|
|
|
|
1. Read relevant existing code before making changes
|
|
2. Match existing patterns and conventions
|
|
3. Run `uv run ruff check src/ tests/` after changes
|
|
4. Run `uv run mypy src/` for type safety
|
|
5. Run `uv run pytest` to verify nothing breaks
|
|
6. For significant changes, follow the OpenSpec workflow
|
|
7. Never commit credentials or secrets
|
|
8. Keep Markdown table outputs clean and consistent
|