Files
Orchestrator/bahn/teamlandkarte-mcp/openspec/changes/add-capacity-to-task-matching-tools/proposal.md
T
ankn a5f8fb49ab Migrate all repos into monorepo context folders
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.
2026-06-30 20:39:52 +02:00

4.4 KiB

Change: Add capacity→task matching tools and embedding-based inference

Why

The server currently supports task→capacity matching (list_open_tasks, get_task_details, find_matching_capacities, find_capacities_for_task). There is no symmetrical workflow to start from a capacity/person and discover relevant tasks.

Additionally, role/requirements inference and task validation still rely on the Azure chat API. This introduces latency/cost, complicates failure semantics, and is redundant given the system already uses embeddings + cosine similarity for matching.

What changes

New MCP tools

  • list_free_capacities(limit=20)
    • Show the X most recent active capacities in a table-first Markdown output.
  • get_capacity_details(capacity_id)
    • Show a single capacity/person entry (same fields as the list, table-first).
  • find_matching_tasks(capacity_id)
    • Match a capacity against all open tasks based on role + competences.
    • Returns paginated Markdown table with task_id, title, required competences, availability, score, and category.

Rework role + competence inference (remove chat API)

  • Replace chat-based role inference with embedding-based role inference:
    • infer roles from a combined text: task title (if present) + task description
    • embed this combined text once and match against a pre-embedded role vocabulary from the Data Lake.
  • Replace chat-based competence extraction/validation with embedding-based competence matching:
    • embed the task text and match against a pre-embedded competence vocabulary from the Data Lake.
  • Store the embedding for task_id (combined title+description text) in the local SQLite embedding cache to minimize repeated embedding costs.

Data Lake sourcing

  • Competence vocabulary: hive.tier1_open_lake.beschaffungstool_kmp_skill_latest (existing source)
  • Role vocabulary: teamlandkarte_v_capacity_roles_latest via columns:
    • role name column: name
    • filters: active=true and staffing_board_relevant=true

Azure OpenAI usage

  • Azure embeddings remain required.
  • Azure chat API usage is removed completely once all dependent features are migrated.

Impact

  • MCP API surface: Adds 3 tools (capacity browsing + capacity→task matching).
  • Business logic: TaskAnalyzer and validation logic migrate to embeddings-only.
  • Data access: Requires new read queries to fetch role/competence vocabularies.
  • Caching: Reuses existing SQLite embedding cache; adds stable keys for task_id text embeddings.
  • Docs: README, assistant prompt, and architecture must be updated.

Non-goals

  • Changing scoring weights or category thresholds.
  • Building a full-text search for tasks/capacities.

Open questions (need confirmation)

  1. “Most recent capacities”: should ordering be by begin_date descending, by end_date descending, or by a DB “created/updated” timestamp (if available)?
  2. list_free_capacities “owner/team”: do you want owner_name only, or both owner_name and an explicit team field (if available in the view)?
  3. Do we keep the existing infer_roles(...) tool name/shape, but change its implementation to embeddings-only (recommended), or introduce a new tool and deprecate the old one?
  4. For embedding-based competence inference for validation: should the output be a ranked list with similarity scores, or a binary chosen set (top-N)? If top-N, what default N?

Confirmed decisions

  • list_free_capacities: order by most recent creation_date.
  • Capacity “Owner/Team”: use the owner_name column (contains the team name).
  • Role inference tool:
    • introduce a new tool and deprecate infer_roles
    • the new tool returns only the single closest role (no rank/rationale)
  • Competence inference:
    • return a maximum of X competences (configurable, default: 8)
    • apply a configurable similarity score threshold (default: 0.4)
    • if max_competences is not specified: no limit on number of competences
    • if min_similarity is not specified: no threshold filtering
    • at least one parameter must be specified to avoid unbounded results
    • if both are set: select top X among those >= threshold
  • Refresh strategy:
    • on startup only
    • only cache-missing roles/competences are embedded
    • embed all open tasks (combined title+description) on startup
    • if something is still missing at runtime, embed on-demand (strict semantics)