Skip to content

batch_map_concepts_from_csv raises ValueError on every row #9

@hyun-hyang

Description

@hyun-hyang

Summary

batch_map_concepts_from_csv is broken on every input row. Since 67fc34a (expand find_omop_concept to return multiple candidate concepts with metadata), find_omop_concept returns

{"candidates": [...], "search_metadata": {...}}        # success
{"error": "..."}                                       # no results

but batch_map_concepts_from_csv still merges that dict directly into a csv.DictWriter row whose fieldnames list expects flat keys (concept_id, code, name, class, concept, validity, domain, vocab, url, reason).

csv.DictWriter defaults to extrasaction='raise', so the merged candidates / search_metadata keys (or the error key) trigger:

ValueError: dict contains fields not in fieldnames: 'candidates', 'search_metadata'

The tool fails on the first row of any input CSV.

Location

async def batch_map_concepts_from_csv(csv_path: str) -> str:
"""
Process a CSV file of keywords, mapping each row and returning a CSV with mapping results appended as new columns.
"""
output = io.StringIO()
with open(csv_path, newline="", encoding="utf-8") as infile:
reader = csv.DictReader(infile)
fieldnames = reader.fieldnames + [
"concept_id",
"code",
"name",
"class",
"concept",
"validity",
"domain",
"vocab",
"url",
"reason",
]
writer = csv.DictWriter(output, fieldnames=fieldnames)
writer.writeheader()
for row in reader:
keyword = row.get("keyword", "")
omop_field = row.get("omop_field", "")
omop_table = row.get("omop_table", "")
result = await find_omop_concept(keyword, omop_table, omop_field)
# Merge result into row
row.update(result)
writer.writerow(row)
return output.getvalue()

Repro

# input.csv
# keyword,omop_table,omop_field
# diabetes,condition_occurrence,condition_concept_id
import asyncio, csv, io
from omop_mcp.server import batch_map_concepts_from_csv
asyncio.run(batch_map_concepts_from_csv("input.csv"))
# ValueError: dict contains fields not in fieldnames: 'candidates', 'search_metadata'

Fix

PR: #10

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions