fip-mcp 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- fip_mcp-0.1.0/.github/workflows/ci.yml +25 -0
- fip_mcp-0.1.0/.github/workflows/publish-pypi.yml +91 -0
- fip_mcp-0.1.0/.gitignore +6 -0
- fip_mcp-0.1.0/CITATION.cff +33 -0
- fip_mcp-0.1.0/LICENSE +21 -0
- fip_mcp-0.1.0/PKG-INFO +120 -0
- fip_mcp-0.1.0/README.md +96 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-astro__format__A__1.json +38 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-astro__format__A__2.json +38 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-astro__format__A__3.json +38 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-astro__format__B__1.json +56 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-astro__format__B__2.json +56 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-astro__format__B__3.json +56 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-astro__identifier__A__1.json +42 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-astro__identifier__A__2.json +38 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-astro__identifier__A__3.json +38 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-astro__identifier__B__1.json +56 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-astro__identifier__B__2.json +56 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-astro__identifier__B__3.json +56 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-astro__licence__A__1.json +38 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-astro__licence__A__2.json +38 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-astro__licence__A__3.json +38 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-astro__licence__B__1.json +56 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-astro__licence__B__2.json +56 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-astro__licence__B__3.json +56 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-astro__provenance__A__1.json +38 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-astro__provenance__A__2.json +38 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-astro__provenance__A__3.json +38 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-astro__provenance__B__1.json +56 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-astro__provenance__B__2.json +56 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-astro__provenance__B__3.json +56 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-astro__repository__A__1.json +38 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-astro__repository__A__2.json +38 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-astro__repository__A__3.json +38 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-astro__repository__B__1.json +56 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-astro__repository__B__2.json +56 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-astro__repository__B__3.json +56 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-astro__vocabulary__A__1.json +38 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-astro__vocabulary__A__2.json +38 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-astro__vocabulary__A__3.json +38 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-astro__vocabulary__B__1.json +56 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-astro__vocabulary__B__2.json +56 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-astro__vocabulary__B__3.json +56 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-bio__format__A__1.json +36 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-bio__format__A__2.json +36 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-bio__format__A__3.json +36 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-bio__format__B__1.json +54 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-bio__format__B__2.json +54 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-bio__format__B__3.json +54 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-bio__identifier__A__1.json +38 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-bio__identifier__A__2.json +38 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-bio__identifier__A__3.json +38 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-bio__identifier__B__1.json +56 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-bio__identifier__B__2.json +56 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-bio__identifier__B__3.json +56 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-bio__licence__A__1.json +39 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-bio__licence__A__2.json +39 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-bio__licence__A__3.json +39 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-bio__licence__B__1.json +57 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-bio__licence__B__2.json +57 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-bio__licence__B__3.json +57 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-bio__provenance__A__1.json +36 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-bio__provenance__A__2.json +36 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-bio__provenance__A__3.json +36 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-bio__provenance__B__1.json +54 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-bio__provenance__B__2.json +54 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-bio__provenance__B__3.json +54 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-bio__repository__A__1.json +38 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-bio__repository__A__2.json +38 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-bio__repository__A__3.json +38 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-bio__repository__B__1.json +56 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-bio__repository__B__2.json +56 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-bio__repository__B__3.json +56 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-bio__vocabulary__A__1.json +36 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-bio__vocabulary__A__2.json +36 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-bio__vocabulary__A__3.json +36 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-bio__vocabulary__B__1.json +54 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-bio__vocabulary__B__2.json +54 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-bio__vocabulary__B__3.json +54 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-eo__format__A__1.json +38 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-eo__format__A__2.json +38 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-eo__format__A__3.json +38 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-eo__format__B__1.json +56 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-eo__format__B__2.json +56 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-eo__format__B__3.json +56 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-eo__identifier__A__1.json +38 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-eo__identifier__A__2.json +38 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-eo__identifier__A__3.json +38 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-eo__identifier__B__1.json +56 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-eo__identifier__B__2.json +56 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-eo__identifier__B__3.json +56 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-eo__licence__A__1.json +38 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-eo__licence__A__2.json +38 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-eo__licence__A__3.json +38 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-eo__licence__B__1.json +56 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-eo__licence__B__2.json +56 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-eo__licence__B__3.json +56 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-eo__provenance__A__1.json +38 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-eo__provenance__A__2.json +38 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-eo__provenance__A__3.json +38 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-eo__provenance__B__1.json +56 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-eo__provenance__B__2.json +56 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-eo__provenance__B__3.json +56 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-eo__repository__A__1.json +39 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-eo__repository__A__2.json +39 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-eo__repository__A__3.json +39 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-eo__repository__B__1.json +57 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-eo__repository__B__2.json +57 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-eo__repository__B__3.json +57 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-eo__vocabulary__A__1.json +38 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-eo__vocabulary__A__2.json +38 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-eo__vocabulary__A__3.json +38 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-eo__vocabulary__B__1.json +56 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-eo__vocabulary__B__2.json +56 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/fiesta-eo__vocabulary__B__3.json +56 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/items.json +178 -0
- fip_mcp-0.1.0/eval/results/baseline-fips-2026-10-20/report.md +143 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-astro__format__A__1.json +39 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-astro__format__A__2.json +39 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-astro__format__A__3.json +39 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-astro__format__B__1.json +57 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-astro__format__B__2.json +57 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-astro__format__B__3.json +57 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-astro__identifier__A__1.json +39 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-astro__identifier__A__2.json +39 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-astro__identifier__A__3.json +39 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-astro__identifier__B__1.json +57 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-astro__identifier__B__2.json +57 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-astro__identifier__B__3.json +57 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-astro__licence__A__1.json +39 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-astro__licence__A__2.json +39 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-astro__licence__A__3.json +39 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-astro__licence__B__1.json +57 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-astro__licence__B__2.json +57 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-astro__licence__B__3.json +57 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-astro__provenance__A__1.json +39 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-astro__provenance__A__2.json +39 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-astro__provenance__A__3.json +39 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-astro__provenance__B__1.json +57 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-astro__provenance__B__2.json +57 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-astro__provenance__B__3.json +57 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-astro__repository__A__1.json +39 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-astro__repository__A__2.json +39 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-astro__repository__A__3.json +39 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-astro__repository__B__1.json +57 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-astro__repository__B__2.json +57 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-astro__repository__B__3.json +57 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-astro__vocabulary__A__1.json +39 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-astro__vocabulary__A__2.json +39 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-astro__vocabulary__A__3.json +39 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-astro__vocabulary__B__1.json +57 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-astro__vocabulary__B__2.json +57 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-astro__vocabulary__B__3.json +57 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-bio__format__A__1.json +37 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-bio__format__A__2.json +37 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-bio__format__A__3.json +37 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-bio__format__B__1.json +56 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-bio__format__B__2.json +56 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-bio__format__B__3.json +55 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-bio__identifier__A__1.json +39 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-bio__identifier__A__2.json +39 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-bio__identifier__A__3.json +39 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-bio__identifier__B__1.json +57 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-bio__identifier__B__2.json +57 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-bio__identifier__B__3.json +57 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-bio__licence__A__1.json +40 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-bio__licence__A__2.json +40 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-bio__licence__A__3.json +40 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-bio__licence__B__1.json +58 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-bio__licence__B__2.json +58 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-bio__licence__B__3.json +58 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-bio__provenance__A__1.json +37 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-bio__provenance__A__2.json +37 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-bio__provenance__A__3.json +37 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-bio__provenance__B__1.json +56 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-bio__provenance__B__2.json +56 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-bio__provenance__B__3.json +56 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-bio__repository__A__1.json +39 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-bio__repository__A__2.json +39 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-bio__repository__A__3.json +39 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-bio__repository__B__1.json +58 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-bio__repository__B__2.json +58 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-bio__repository__B__3.json +57 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-bio__vocabulary__A__1.json +37 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-bio__vocabulary__A__2.json +37 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-bio__vocabulary__A__3.json +37 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-bio__vocabulary__B__1.json +55 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-bio__vocabulary__B__2.json +55 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-bio__vocabulary__B__3.json +55 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-eo__format__A__1.json +39 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-eo__format__A__2.json +39 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-eo__format__A__3.json +39 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-eo__format__B__1.json +57 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-eo__format__B__2.json +57 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-eo__format__B__3.json +57 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-eo__identifier__A__1.json +39 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-eo__identifier__A__2.json +39 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-eo__identifier__A__3.json +39 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-eo__identifier__B__1.json +57 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-eo__identifier__B__2.json +57 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-eo__identifier__B__3.json +57 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-eo__licence__A__1.json +39 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-eo__licence__A__2.json +39 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-eo__licence__A__3.json +39 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-eo__licence__B__1.json +57 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-eo__licence__B__2.json +57 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-eo__licence__B__3.json +57 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-eo__provenance__A__1.json +39 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-eo__provenance__A__2.json +39 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-eo__provenance__A__3.json +39 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-eo__provenance__B__1.json +57 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-eo__provenance__B__2.json +57 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-eo__provenance__B__3.json +57 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-eo__repository__A__1.json +40 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-eo__repository__A__2.json +40 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-eo__repository__A__3.json +40 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-eo__repository__B__1.json +58 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-eo__repository__B__2.json +58 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-eo__repository__B__3.json +58 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-eo__vocabulary__A__1.json +39 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-eo__vocabulary__A__2.json +39 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-eo__vocabulary__A__3.json +39 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-eo__vocabulary__B__1.json +57 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-eo__vocabulary__B__2.json +57 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/fiesta-eo__vocabulary__B__3.json +57 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/items.json +196 -0
- fip_mcp-0.1.0/eval/results/plain-fips-2026-10-20/report.md +143 -0
- fip_mcp-0.1.0/eval/results/smoke/fiesta-bio__format__A__1.json +36 -0
- fip_mcp-0.1.0/eval/results/smoke/fiesta-bio__format__B__1.json +54 -0
- fip_mcp-0.1.0/eval/results/smoke/items.json +10 -0
- fip_mcp-0.1.0/eval/results/smoke/report.md +31 -0
- fip_mcp-0.1.0/eval/run_eval.py +146 -0
- fip_mcp-0.1.0/eval/score.py +138 -0
- fip_mcp-0.1.0/pyproject.toml +40 -0
- fip_mcp-0.1.0/server.json +22 -0
- fip_mcp-0.1.0/src/fip_mcp/__init__.py +3 -0
- fip_mcp-0.1.0/src/fip_mcp/checks.py +187 -0
- fip_mcp-0.1.0/src/fip_mcp/cli.py +30 -0
- fip_mcp-0.1.0/src/fip_mcp/crosswalk.py +58 -0
- fip_mcp-0.1.0/src/fip_mcp/data/communities.json +6 -0
- fip_mcp-0.1.0/src/fip_mcp/fip.py +189 -0
- fip_mcp-0.1.0/src/fip_mcp/nanopub.py +100 -0
- fip_mcp-0.1.0/src/fip_mcp/questions.py +77 -0
- fip_mcp-0.1.0/src/fip_mcp/server.py +104 -0
- fip_mcp-0.1.0/src/fip_mcp/service.py +86 -0
- fip_mcp-0.1.0/src/fip_mcp/target.py +133 -0
- fip_mcp-0.1.0/tests/test_offline.py +122 -0
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
name: tests
|
|
2
|
+
|
|
3
|
+
# The suite is hermetic: FIPs are built in-process from fixtures, so CI needs no
|
|
4
|
+
# network and stays green when the nanopublication network is down.
|
|
5
|
+
|
|
6
|
+
on:
|
|
7
|
+
push:
|
|
8
|
+
branches: [main]
|
|
9
|
+
pull_request:
|
|
10
|
+
workflow_dispatch:
|
|
11
|
+
|
|
12
|
+
jobs:
|
|
13
|
+
test:
|
|
14
|
+
runs-on: ubuntu-latest
|
|
15
|
+
strategy:
|
|
16
|
+
fail-fast: false
|
|
17
|
+
matrix:
|
|
18
|
+
python-version: ["3.10", "3.12"]
|
|
19
|
+
steps:
|
|
20
|
+
- uses: actions/checkout@v4
|
|
21
|
+
- uses: actions/setup-python@v5
|
|
22
|
+
with:
|
|
23
|
+
python-version: ${{ matrix.python-version }}
|
|
24
|
+
- run: python -m pip install -e '.[dev]'
|
|
25
|
+
- run: python -m pytest -q
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
name: Publish to PyPI
|
|
2
|
+
|
|
3
|
+
# Release automation. Trigger by pushing a version tag — one push does everything:
|
|
4
|
+
# # bump version in pyproject.toml + src/fip_mcp/__init__.py, commit to main, then:
|
|
5
|
+
# git tag v0.1.0
|
|
6
|
+
# git push origin v0.1.0
|
|
7
|
+
# -> builds sdist+wheel, smoke-tests, CREATES the GitHub Release (auto notes + artefacts),
|
|
8
|
+
# and PUBLISHES to PyPI via Trusted Publishing (OIDC — no API token stored in the repo).
|
|
9
|
+
#
|
|
10
|
+
# Still supported: publishing on a manually-created GitHub Release (release: published) and a
|
|
11
|
+
# manual workflow_dispatch. A Release created by this workflow's GITHUB_TOKEN does NOT re-trigger
|
|
12
|
+
# `release: published`, so tagging never double-publishes.
|
|
13
|
+
#
|
|
14
|
+
# NOTE: PyPI Trusted Publishing matches the *workflow filename* — keep this file named
|
|
15
|
+
# `publish-pypi.yml`. One-time setup on PyPI (pypi.org -> account -> Publishing -> Add a pending
|
|
16
|
+
# publisher), before the first release:
|
|
17
|
+
# PyPI project name : fip-mcp
|
|
18
|
+
# Owner : ScienceLiveHub
|
|
19
|
+
# Repository name : fip-mcp
|
|
20
|
+
# Workflow name : publish-pypi.yml
|
|
21
|
+
# Environment name : pypi
|
|
22
|
+
|
|
23
|
+
on:
|
|
24
|
+
push:
|
|
25
|
+
tags: ["v*"]
|
|
26
|
+
release:
|
|
27
|
+
types: [published]
|
|
28
|
+
workflow_dispatch:
|
|
29
|
+
|
|
30
|
+
jobs:
|
|
31
|
+
build:
|
|
32
|
+
runs-on: ubuntu-latest
|
|
33
|
+
steps:
|
|
34
|
+
- uses: actions/checkout@v4
|
|
35
|
+
- uses: actions/setup-python@v5
|
|
36
|
+
with:
|
|
37
|
+
python-version: "3.12"
|
|
38
|
+
- name: Build sdist + wheel
|
|
39
|
+
run: |
|
|
40
|
+
python -m pip install --upgrade build
|
|
41
|
+
python -m build
|
|
42
|
+
# Offline smoke test: the installed wheel must expose its tools and load. It
|
|
43
|
+
# deliberately hits no network, so a release is never blocked by an upstream
|
|
44
|
+
# outage.
|
|
45
|
+
- name: Smoke-check the installed wheel
|
|
46
|
+
run: |
|
|
47
|
+
python -m pip install dist/*.whl
|
|
48
|
+
python - <<'PY'
|
|
49
|
+
import asyncio
|
|
50
|
+
import fip_mcp as f
|
|
51
|
+
from fip_mcp.server import mcp
|
|
52
|
+
names = {t.name for t in asyncio.run(mcp.list_tools())}
|
|
53
|
+
assert {"communities", "profile", "recommend", "check", "crosswalk"} <= names, names
|
|
54
|
+
print("ok", f.__version__, sorted(names))
|
|
55
|
+
PY
|
|
56
|
+
- uses: actions/upload-artifact@v4
|
|
57
|
+
with:
|
|
58
|
+
name: dist
|
|
59
|
+
path: dist/
|
|
60
|
+
|
|
61
|
+
# Create the GitHub Release when a version tag is pushed (auto-generated notes + built
|
|
62
|
+
# artefacts). Skipped when triggered by an already-published Release or a manual dispatch.
|
|
63
|
+
github-release:
|
|
64
|
+
if: startsWith(github.ref, 'refs/tags/v')
|
|
65
|
+
needs: build
|
|
66
|
+
runs-on: ubuntu-latest
|
|
67
|
+
permissions:
|
|
68
|
+
contents: write
|
|
69
|
+
steps:
|
|
70
|
+
- uses: actions/download-artifact@v4
|
|
71
|
+
with:
|
|
72
|
+
name: dist
|
|
73
|
+
path: dist/
|
|
74
|
+
- name: Create GitHub Release
|
|
75
|
+
uses: softprops/action-gh-release@v2
|
|
76
|
+
with:
|
|
77
|
+
generate_release_notes: true
|
|
78
|
+
files: dist/*
|
|
79
|
+
|
|
80
|
+
publish:
|
|
81
|
+
needs: build
|
|
82
|
+
runs-on: ubuntu-latest
|
|
83
|
+
environment: pypi
|
|
84
|
+
permissions:
|
|
85
|
+
id-token: write # required for trusted publishing
|
|
86
|
+
steps:
|
|
87
|
+
- uses: actions/download-artifact@v4
|
|
88
|
+
with:
|
|
89
|
+
name: dist
|
|
90
|
+
path: dist/
|
|
91
|
+
- uses: pypa/gh-action-pypi-publish@release/v1
|
fip_mcp-0.1.0/.gitignore
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
cff-version: 1.2.0
|
|
2
|
+
title: fip-mcp
|
|
3
|
+
message: >-
|
|
4
|
+
If you use fip-mcp, please cite it using the metadata in this file.
|
|
5
|
+
type: software
|
|
6
|
+
authors:
|
|
7
|
+
- family-names: Fouilloux
|
|
8
|
+
given-names: Anne
|
|
9
|
+
orcid: https://orcid.org/0000-0002-1784-2920
|
|
10
|
+
affiliation: LifeWatch ERIC
|
|
11
|
+
repository-code: https://github.com/ScienceLiveHub/fip-mcp
|
|
12
|
+
url: https://sciencelive4all.org
|
|
13
|
+
abstract: >-
|
|
14
|
+
An MCP server that turns community FAIR Implementation Profiles (FIPs),
|
|
15
|
+
published as nanopublications, into guidance and deterministic compliance
|
|
16
|
+
checks for AI agents. An agent asks the FIP what the community agreed before
|
|
17
|
+
it suggests a repository, format, licence or vocabulary, and can check a
|
|
18
|
+
folder or a Zenodo record against the FIP. Verdicts are computed by code;
|
|
19
|
+
resources that cannot be tested are reported as manual, and questions the
|
|
20
|
+
community left open are reported as gaps. Developed in the OSCARS-FIESTA
|
|
21
|
+
project (EU Horizon Europe grant 101129751) and maintained by the Science
|
|
22
|
+
Live community.
|
|
23
|
+
keywords:
|
|
24
|
+
- FAIR
|
|
25
|
+
- FAIR Implementation Profile
|
|
26
|
+
- FIP
|
|
27
|
+
- nanopublications
|
|
28
|
+
- research data management
|
|
29
|
+
- MCP
|
|
30
|
+
- AI agents
|
|
31
|
+
- Science Live
|
|
32
|
+
license: MIT
|
|
33
|
+
version: 0.1.0
|
fip_mcp-0.1.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Anne Fouilloux
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
fip_mcp-0.1.0/PKG-INFO
ADDED
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: fip-mcp
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: MCP server that turns FAIR Implementation Profiles into guidance and deterministic compliance checks for AI agents.
|
|
5
|
+
Project-URL: Homepage, https://github.com/ScienceLiveHub/fip-mcp
|
|
6
|
+
Project-URL: Repository, https://github.com/ScienceLiveHub/fip-mcp
|
|
7
|
+
Project-URL: FIP Ontology, https://w3id.org/fair/fip/terms/FIP-Ontology
|
|
8
|
+
Project-URL: Science Live, https://sciencelive4all.org
|
|
9
|
+
Author: Anne Fouilloux
|
|
10
|
+
License: MIT
|
|
11
|
+
License-File: LICENSE
|
|
12
|
+
Keywords: FAIR,FAIR Implementation Profile,FIP,mcp,nanopublication,research-data,science-live
|
|
13
|
+
Classifier: Development Status :: 3 - Alpha
|
|
14
|
+
Classifier: Intended Audience :: Science/Research
|
|
15
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
16
|
+
Classifier: Programming Language :: Python :: 3
|
|
17
|
+
Classifier: Topic :: Scientific/Engineering
|
|
18
|
+
Requires-Python: >=3.10
|
|
19
|
+
Requires-Dist: mcp<2,>=1.2.0
|
|
20
|
+
Requires-Dist: rdflib>=7
|
|
21
|
+
Provides-Extra: dev
|
|
22
|
+
Requires-Dist: pytest>=8; extra == 'dev'
|
|
23
|
+
Description-Content-Type: text/markdown
|
|
24
|
+
|
|
25
|
+
# fip-mcp
|
|
26
|
+
|
|
27
|
+
<!-- mcp-name: org.sciencelive4all/fip-mcp -->
|
|
28
|
+
|
|
29
|
+
An MCP server that turns community **FAIR Implementation Profiles (FIPs)** into
|
|
30
|
+
guidance and deterministic compliance checks for AI agents such as Claude Code.
|
|
31
|
+
|
|
32
|
+
A FIP records a community's agreed FAIR choices: identifiers, repositories, formats,
|
|
33
|
+
vocabularies, licences and provenance models. It is published as nanopublications
|
|
34
|
+
by the [FIP Wizard](https://fip.fair-wizard.com). Today FIPs are mostly filled in
|
|
35
|
+
once and rarely read again. This server makes them operational. An agent helping a
|
|
36
|
+
researcher asks the FIP what the community agreed before it suggests anything, and
|
|
37
|
+
can check work against the FIP.
|
|
38
|
+
|
|
39
|
+
fip-mcp was developed in the [OSCARS](https://oscars-project.eu)-funded
|
|
40
|
+
**FIESTA** project (*FAIR Image Data Workflows in Galaxy*), and is maintained by
|
|
41
|
+
the [Science Live](https://sciencelive4all.org) community.
|
|
42
|
+
|
|
43
|
+
## Tools
|
|
44
|
+
|
|
45
|
+
| Tool | What it does |
|
|
46
|
+
|---|---|
|
|
47
|
+
| `communities` | Known communities and their FIP nanopubs (any tool also accepts a FIP URI). |
|
|
48
|
+
| `profile` | The community's choices question by question, from the **latest** FIP version. |
|
|
49
|
+
| `recommend` | What the community agreed for a topic (`format`, `repository`, `licence`, …). |
|
|
50
|
+
| `check` | Checks a folder or Zenodo record against the FIP: `pass` / `fail` (+ `fix`) / `manual` / `no-choice`. |
|
|
51
|
+
| `crosswalk` | What changes when a workflow or dataset moves between two communities. |
|
|
52
|
+
|
|
53
|
+
Design rules:
|
|
54
|
+
|
|
55
|
+
- **Verdicts are code, not LLM judgement.** Each declared resource maps to a probe
|
|
56
|
+
of facts read from the target. A resource with no probe is `manual`, so the agent
|
|
57
|
+
asks the user instead of guessing.
|
|
58
|
+
- **A community gap stays a gap.** `no-choice` is reported as a gap in the FIP, and
|
|
59
|
+
the agent is told not to put its own preference in its place.
|
|
60
|
+
- **Latest version.** The FIP Wizard republishes a FIP *and* its declaration index,
|
|
61
|
+
and both supersede their predecessors. The resolver only follows successors that
|
|
62
|
+
are themselves FIPs.
|
|
63
|
+
|
|
64
|
+
## Install and use
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
pipx install fip-mcp
|
|
68
|
+
claude mcp add fip -s user -- fip-mcp # as an MCP server
|
|
69
|
+
fip-check check fiesta-eo 10.5281/zenodo.20960690 # same operations from the shell
|
|
70
|
+
fip-check crosswalk fiesta-bio fiesta-eo
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
Nanopubs are cached in `~/.cache/fip-mcp`. They are immutable, so they are cached
|
|
74
|
+
for good. Version lookups always go to the network.
|
|
75
|
+
|
|
76
|
+
For development: `pip install -e '.[dev]'` and `python -m pytest -q` (the tests need
|
|
77
|
+
no network).
|
|
78
|
+
|
|
79
|
+
## Status
|
|
80
|
+
|
|
81
|
+
Prototype. The short names in `src/fip_mcp/data` cover the Astronomy, Bioimaging
|
|
82
|
+
and Earth Observation FIPs of the OSCARS-FIESTA community *FAIR Image Data Workflows
|
|
83
|
+
in Galaxy*. Any tool also accepts the nanopublication URI of another FIP, but the
|
|
84
|
+
`check` probes have so far only been exercised on FIESTA outputs.
|
|
85
|
+
|
|
86
|
+
## Assistant test
|
|
87
|
+
|
|
88
|
+
`eval/` tests whether an AI assistant follows a community's FIP, with and without
|
|
89
|
+
fip-mcp. It asks 6 questions (repository, data format, licence, identifier,
|
|
90
|
+
vocabulary, provenance) for each of the 3 FIESTA communities, 3 runs per condition.
|
|
91
|
+
The expected answers are read from the published FIPs, not typed by hand. Results
|
|
92
|
+
from 2026-10-20 (Claude Opus 5.5, web and file tools disabled) are in
|
|
93
|
+
`eval/results/`:
|
|
94
|
+
|
|
95
|
+
| Variant | Without fip-mcp | With fip-mcp |
|
|
96
|
+
|---|---|---|
|
|
97
|
+
| *choice*: "what has my community agreed?" | 54 of 54 abstain | 54 of 54 give the declared choice or report the gap |
|
|
98
|
+
| *plain*: "what do you recommend?", declared questions | 30 of 45 on-profile, 15 off-profile | 45 of 45 on-profile |
|
|
99
|
+
| *plain*: questions the community left open | 9 of 9 recommend their own default, with a caveat | 9 of 9 report the gap |
|
|
100
|
+
|
|
101
|
+
```bash
|
|
102
|
+
python eval/run_eval.py --runs 3 --out eval/results/<name> # needs Claude Code
|
|
103
|
+
python eval/score.py eval/results/<name>
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
## Citation
|
|
107
|
+
|
|
108
|
+
Please cite fip-mcp with the metadata in [`CITATION.cff`](CITATION.cff).
|
|
109
|
+
|
|
110
|
+
## Funding
|
|
111
|
+
|
|
112
|
+
fip-mcp was developed within **FIESTA**, a project funded by OSCARS (*Open Science
|
|
113
|
+
Clusters' Action for Research and Society*). OSCARS is funded by the European
|
|
114
|
+
Union's Horizon Europe programme under grant agreement No 101129751. Views and
|
|
115
|
+
opinions expressed are those of the authors only and do not necessarily reflect
|
|
116
|
+
those of the European Union. Neither the European Union nor the granting authority
|
|
117
|
+
can be held responsible for them.
|
|
118
|
+
|
|
119
|
+
Science Live is a community-driven, unfunded initiative. Further funders will be
|
|
120
|
+
listed here as they support the work.
|
fip_mcp-0.1.0/README.md
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
# fip-mcp
|
|
2
|
+
|
|
3
|
+
<!-- mcp-name: org.sciencelive4all/fip-mcp -->
|
|
4
|
+
|
|
5
|
+
An MCP server that turns community **FAIR Implementation Profiles (FIPs)** into
|
|
6
|
+
guidance and deterministic compliance checks for AI agents such as Claude Code.
|
|
7
|
+
|
|
8
|
+
A FIP records a community's agreed FAIR choices: identifiers, repositories, formats,
|
|
9
|
+
vocabularies, licences and provenance models. It is published as nanopublications
|
|
10
|
+
by the [FIP Wizard](https://fip.fair-wizard.com). Today FIPs are mostly filled in
|
|
11
|
+
once and rarely read again. This server makes them operational. An agent helping a
|
|
12
|
+
researcher asks the FIP what the community agreed before it suggests anything, and
|
|
13
|
+
can check work against the FIP.
|
|
14
|
+
|
|
15
|
+
fip-mcp was developed in the [OSCARS](https://oscars-project.eu)-funded
|
|
16
|
+
**FIESTA** project (*FAIR Image Data Workflows in Galaxy*), and is maintained by
|
|
17
|
+
the [Science Live](https://sciencelive4all.org) community.
|
|
18
|
+
|
|
19
|
+
## Tools
|
|
20
|
+
|
|
21
|
+
| Tool | What it does |
|
|
22
|
+
|---|---|
|
|
23
|
+
| `communities` | Known communities and their FIP nanopubs (any tool also accepts a FIP URI). |
|
|
24
|
+
| `profile` | The community's choices question by question, from the **latest** FIP version. |
|
|
25
|
+
| `recommend` | What the community agreed for a topic (`format`, `repository`, `licence`, …). |
|
|
26
|
+
| `check` | Checks a folder or Zenodo record against the FIP: `pass` / `fail` (+ `fix`) / `manual` / `no-choice`. |
|
|
27
|
+
| `crosswalk` | What changes when a workflow or dataset moves between two communities. |
|
|
28
|
+
|
|
29
|
+
Design rules:
|
|
30
|
+
|
|
31
|
+
- **Verdicts are code, not LLM judgement.** Each declared resource maps to a probe
|
|
32
|
+
of facts read from the target. A resource with no probe is `manual`, so the agent
|
|
33
|
+
asks the user instead of guessing.
|
|
34
|
+
- **A community gap stays a gap.** `no-choice` is reported as a gap in the FIP, and
|
|
35
|
+
the agent is told not to put its own preference in its place.
|
|
36
|
+
- **Latest version.** The FIP Wizard republishes a FIP *and* its declaration index,
|
|
37
|
+
and both supersede their predecessors. The resolver only follows successors that
|
|
38
|
+
are themselves FIPs.
|
|
39
|
+
|
|
40
|
+
## Install and use
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
pipx install fip-mcp
|
|
44
|
+
claude mcp add fip -s user -- fip-mcp # as an MCP server
|
|
45
|
+
fip-check check fiesta-eo 10.5281/zenodo.20960690 # same operations from the shell
|
|
46
|
+
fip-check crosswalk fiesta-bio fiesta-eo
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Nanopubs are cached in `~/.cache/fip-mcp`. They are immutable, so they are cached
|
|
50
|
+
for good. Version lookups always go to the network.
|
|
51
|
+
|
|
52
|
+
For development: `pip install -e '.[dev]'` and `python -m pytest -q` (the tests need
|
|
53
|
+
no network).
|
|
54
|
+
|
|
55
|
+
## Status
|
|
56
|
+
|
|
57
|
+
Prototype. The short names in `src/fip_mcp/data` cover the Astronomy, Bioimaging
|
|
58
|
+
and Earth Observation FIPs of the OSCARS-FIESTA community *FAIR Image Data Workflows
|
|
59
|
+
in Galaxy*. Any tool also accepts the nanopublication URI of another FIP, but the
|
|
60
|
+
`check` probes have so far only been exercised on FIESTA outputs.
|
|
61
|
+
|
|
62
|
+
## Assistant test
|
|
63
|
+
|
|
64
|
+
`eval/` tests whether an AI assistant follows a community's FIP, with and without
|
|
65
|
+
fip-mcp. It asks 6 questions (repository, data format, licence, identifier,
|
|
66
|
+
vocabulary, provenance) for each of the 3 FIESTA communities, 3 runs per condition.
|
|
67
|
+
The expected answers are read from the published FIPs, not typed by hand. Results
|
|
68
|
+
from 2026-10-20 (Claude Opus 5.5, web and file tools disabled) are in
|
|
69
|
+
`eval/results/`:
|
|
70
|
+
|
|
71
|
+
| Variant | Without fip-mcp | With fip-mcp |
|
|
72
|
+
|---|---|---|
|
|
73
|
+
| *choice*: "what has my community agreed?" | 54 of 54 abstain | 54 of 54 give the declared choice or report the gap |
|
|
74
|
+
| *plain*: "what do you recommend?", declared questions | 30 of 45 on-profile, 15 off-profile | 45 of 45 on-profile |
|
|
75
|
+
| *plain*: questions the community left open | 9 of 9 recommend their own default, with a caveat | 9 of 9 report the gap |
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
python eval/run_eval.py --runs 3 --out eval/results/<name> # needs Claude Code
|
|
79
|
+
python eval/score.py eval/results/<name>
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
## Citation
|
|
83
|
+
|
|
84
|
+
Please cite fip-mcp with the metadata in [`CITATION.cff`](CITATION.cff).
|
|
85
|
+
|
|
86
|
+
## Funding
|
|
87
|
+
|
|
88
|
+
fip-mcp was developed within **FIESTA**, a project funded by OSCARS (*Open Science
|
|
89
|
+
Clusters' Action for Research and Society*). OSCARS is funded by the European
|
|
90
|
+
Union's Horizon Europe programme under grant agreement No 101129751. Views and
|
|
91
|
+
opinions expressed are those of the authors only and do not necessarily reflect
|
|
92
|
+
those of the European Union. Neither the European Union nor the granting authority
|
|
93
|
+
can be held responsible for them.
|
|
94
|
+
|
|
95
|
+
Science Live is a community-driven, unfunded initiative. Further funders will be
|
|
96
|
+
listed here as they support the work.
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "fiesta-astro:format",
|
|
3
|
+
"community": "fiesta-astro",
|
|
4
|
+
"topic": "format",
|
|
5
|
+
"question": "I1-D",
|
|
6
|
+
"expected": [
|
|
7
|
+
"Flexible Image Transport System"
|
|
8
|
+
],
|
|
9
|
+
"prompt": "I'm a researcher in the FIESTA Astronomy community (part of the 'FAIR Image Data Workflows in Galaxy' community). Which file format should I use for my image datasets?\n\nAnswer briefly. On the last line write exactly one of:\nCOMMUNITY_CHOICE: <the resource(s) my community has agreed on, comma-separated>\nCOMMUNITY_CHOICE: NOT_DECLARED (my community has explicitly not agreed on one)\nCOMMUNITY_CHOICE: DONT_KNOW (you cannot tell what my community agreed)",
|
|
10
|
+
"condition": "A",
|
|
11
|
+
"run": 1,
|
|
12
|
+
"model": "claude-opus-5-5",
|
|
13
|
+
"toolsAvailable": [
|
|
14
|
+
"CronCreate",
|
|
15
|
+
"CronDelete",
|
|
16
|
+
"CronList",
|
|
17
|
+
"DesignSync",
|
|
18
|
+
"EnterWorktree",
|
|
19
|
+
"ExitWorktree",
|
|
20
|
+
"ListAgents",
|
|
21
|
+
"Monitor",
|
|
22
|
+
"PushNotification",
|
|
23
|
+
"RemoteTrigger",
|
|
24
|
+
"ReportFindings",
|
|
25
|
+
"ScheduleWakeup",
|
|
26
|
+
"SendMessage",
|
|
27
|
+
"TaskStop",
|
|
28
|
+
"ToolSearch",
|
|
29
|
+
"Workflow"
|
|
30
|
+
],
|
|
31
|
+
"mcpServers": [],
|
|
32
|
+
"toolCalls": [],
|
|
33
|
+
"answer": "Astronomy image data is usually stored as **FITS** (Flexible Image Transport System). It's the IAU-endorsed standard, Galaxy's astronomy tools support it, and it keeps the metadata (WCS, observation headers) inside the file. For general bioimage-style workflows in the wider \"FAIR Image Data Workflows in Galaxy\" effort, **OME-TIFF** or **OME-Zarr** are the common choices.\n\nI can't see any declaration, such as a FAIR Implementation Profile, showing which format the FIESTA Astronomy community has formally agreed on. FITS is my best guess, not a confirmed community decision. Check your community's FIP or ask its coordinators.\n\nCOMMUNITY_CHOICE: DONT_KNOW",
|
|
34
|
+
"isError": false,
|
|
35
|
+
"costUsd": 0.030035200000000005,
|
|
36
|
+
"seconds": 6.6,
|
|
37
|
+
"stderr": ""
|
|
38
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "fiesta-astro:format",
|
|
3
|
+
"community": "fiesta-astro",
|
|
4
|
+
"topic": "format",
|
|
5
|
+
"question": "I1-D",
|
|
6
|
+
"expected": [
|
|
7
|
+
"Flexible Image Transport System"
|
|
8
|
+
],
|
|
9
|
+
"prompt": "I'm a researcher in the FIESTA Astronomy community (part of the 'FAIR Image Data Workflows in Galaxy' community). Which file format should I use for my image datasets?\n\nAnswer briefly. On the last line write exactly one of:\nCOMMUNITY_CHOICE: <the resource(s) my community has agreed on, comma-separated>\nCOMMUNITY_CHOICE: NOT_DECLARED (my community has explicitly not agreed on one)\nCOMMUNITY_CHOICE: DONT_KNOW (you cannot tell what my community agreed)",
|
|
10
|
+
"condition": "A",
|
|
11
|
+
"run": 2,
|
|
12
|
+
"model": "claude-opus-5-5",
|
|
13
|
+
"toolsAvailable": [
|
|
14
|
+
"CronCreate",
|
|
15
|
+
"CronDelete",
|
|
16
|
+
"CronList",
|
|
17
|
+
"DesignSync",
|
|
18
|
+
"EnterWorktree",
|
|
19
|
+
"ExitWorktree",
|
|
20
|
+
"ListAgents",
|
|
21
|
+
"Monitor",
|
|
22
|
+
"PushNotification",
|
|
23
|
+
"RemoteTrigger",
|
|
24
|
+
"ReportFindings",
|
|
25
|
+
"ScheduleWakeup",
|
|
26
|
+
"SendMessage",
|
|
27
|
+
"TaskStop",
|
|
28
|
+
"ToolSearch",
|
|
29
|
+
"Workflow"
|
|
30
|
+
],
|
|
31
|
+
"mcpServers": [],
|
|
32
|
+
"toolCalls": [],
|
|
33
|
+
"answer": "For astronomy image data, **FITS** (Flexible Image Transport System) is the usual choice. It's the IAU-endorsed standard, it stores metadata in its headers (including WCS coordinates), and Galaxy's astronomy tools support it. If your Galaxy imaging workflows also reach into bioimaging-style tools, OME-TIFF or OME-Zarr are the common open formats there.\n\nHowever, I can't see the FAIR Implementation Profile (FIP) for FIESTA Astronomy or for the \"FAIR Image Data Workflows in Galaxy\" community, so I can't confirm which format your community formally declared. Check your community's published FIP, for example on the FIP Wizard or as FAIR Enabling Resource nanopublications.\n\nCOMMUNITY_CHOICE: DONT_KNOW",
|
|
34
|
+
"isError": false,
|
|
35
|
+
"costUsd": 0.0324712,
|
|
36
|
+
"seconds": 8.2,
|
|
37
|
+
"stderr": ""
|
|
38
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "fiesta-astro:format",
|
|
3
|
+
"community": "fiesta-astro",
|
|
4
|
+
"topic": "format",
|
|
5
|
+
"question": "I1-D",
|
|
6
|
+
"expected": [
|
|
7
|
+
"Flexible Image Transport System"
|
|
8
|
+
],
|
|
9
|
+
"prompt": "I'm a researcher in the FIESTA Astronomy community (part of the 'FAIR Image Data Workflows in Galaxy' community). Which file format should I use for my image datasets?\n\nAnswer briefly. On the last line write exactly one of:\nCOMMUNITY_CHOICE: <the resource(s) my community has agreed on, comma-separated>\nCOMMUNITY_CHOICE: NOT_DECLARED (my community has explicitly not agreed on one)\nCOMMUNITY_CHOICE: DONT_KNOW (you cannot tell what my community agreed)",
|
|
10
|
+
"condition": "A",
|
|
11
|
+
"run": 3,
|
|
12
|
+
"model": "claude-opus-5-5",
|
|
13
|
+
"toolsAvailable": [
|
|
14
|
+
"CronCreate",
|
|
15
|
+
"CronDelete",
|
|
16
|
+
"CronList",
|
|
17
|
+
"DesignSync",
|
|
18
|
+
"EnterWorktree",
|
|
19
|
+
"ExitWorktree",
|
|
20
|
+
"ListAgents",
|
|
21
|
+
"Monitor",
|
|
22
|
+
"PushNotification",
|
|
23
|
+
"RemoteTrigger",
|
|
24
|
+
"ReportFindings",
|
|
25
|
+
"ScheduleWakeup",
|
|
26
|
+
"SendMessage",
|
|
27
|
+
"TaskStop",
|
|
28
|
+
"ToolSearch",
|
|
29
|
+
"Workflow"
|
|
30
|
+
],
|
|
31
|
+
"mcpServers": [],
|
|
32
|
+
"toolCalls": [],
|
|
33
|
+
"answer": "FITS is the usual format for astronomical image data. It's an IAU-endorsed standard, it keeps metadata in its headers, and Galaxy and most astronomy tools support it well. Many imaging workflows also convert to OME-TIFF or OME-Zarr when they need to work with general bioimage tools.\n\nI don't have a record of what the FIESTA Astronomy community formally agreed in its FAIR Implementation Profile, and I couldn't look it up from here. So FITS is a sensible default, not a confirmed community decision. Check your community's FIP on the FIP Wizard or FAIR Connect to see what it actually declared.\n\nCOMMUNITY_CHOICE: DONT_KNOW",
|
|
34
|
+
"isError": false,
|
|
35
|
+
"costUsd": 0.0303592,
|
|
36
|
+
"seconds": 6.4,
|
|
37
|
+
"stderr": ""
|
|
38
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "fiesta-astro:format",
|
|
3
|
+
"community": "fiesta-astro",
|
|
4
|
+
"topic": "format",
|
|
5
|
+
"question": "I1-D",
|
|
6
|
+
"expected": [
|
|
7
|
+
"Flexible Image Transport System"
|
|
8
|
+
],
|
|
9
|
+
"prompt": "I'm a researcher in the FIESTA Astronomy community (part of the 'FAIR Image Data Workflows in Galaxy' community). Which file format should I use for my image datasets?\n\nAnswer briefly. On the last line write exactly one of:\nCOMMUNITY_CHOICE: <the resource(s) my community has agreed on, comma-separated>\nCOMMUNITY_CHOICE: NOT_DECLARED (my community has explicitly not agreed on one)\nCOMMUNITY_CHOICE: DONT_KNOW (you cannot tell what my community agreed)",
|
|
10
|
+
"condition": "B",
|
|
11
|
+
"run": 1,
|
|
12
|
+
"model": "claude-opus-5-5",
|
|
13
|
+
"toolsAvailable": [
|
|
14
|
+
"CronCreate",
|
|
15
|
+
"CronDelete",
|
|
16
|
+
"CronList",
|
|
17
|
+
"DesignSync",
|
|
18
|
+
"EnterWorktree",
|
|
19
|
+
"ExitWorktree",
|
|
20
|
+
"ListAgents",
|
|
21
|
+
"ListMcpResourcesTool",
|
|
22
|
+
"Monitor",
|
|
23
|
+
"PushNotification",
|
|
24
|
+
"ReadMcpResourceDirTool",
|
|
25
|
+
"ReadMcpResourceTool",
|
|
26
|
+
"RemoteTrigger",
|
|
27
|
+
"ReportFindings",
|
|
28
|
+
"ScheduleWakeup",
|
|
29
|
+
"SendMessage",
|
|
30
|
+
"TaskStop",
|
|
31
|
+
"ToolSearch",
|
|
32
|
+
"Workflow",
|
|
33
|
+
"mcp__fip__check",
|
|
34
|
+
"mcp__fip__communities",
|
|
35
|
+
"mcp__fip__crosswalk",
|
|
36
|
+
"mcp__fip__profile",
|
|
37
|
+
"mcp__fip__recommend"
|
|
38
|
+
],
|
|
39
|
+
"mcpServers": [
|
|
40
|
+
{
|
|
41
|
+
"name": "fip",
|
|
42
|
+
"status": "connected",
|
|
43
|
+
"source": "dynamic"
|
|
44
|
+
}
|
|
45
|
+
],
|
|
46
|
+
"toolCalls": [
|
|
47
|
+
"ToolSearch",
|
|
48
|
+
"mcp__fip__communities",
|
|
49
|
+
"mcp__fip__recommend"
|
|
50
|
+
],
|
|
51
|
+
"answer": "Use **FITS (Flexible Image Transport System)** for your image datasets. It's the data format the FIESTA Astronomy community chose in its latest FAIR Implementation Profile (question I1\u2011D). FITS was built for scientific imaging in astronomy, so it can record photometric and spatial calibration information along with the image.\n\nFor metadata records, the same profile lists XML and RDF.\n\nCOMMUNITY_CHOICE: Flexible Image Transport System (FITS)",
|
|
52
|
+
"isError": false,
|
|
53
|
+
"costUsd": 0.057587,
|
|
54
|
+
"seconds": 8.3,
|
|
55
|
+
"stderr": ""
|
|
56
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "fiesta-astro:format",
|
|
3
|
+
"community": "fiesta-astro",
|
|
4
|
+
"topic": "format",
|
|
5
|
+
"question": "I1-D",
|
|
6
|
+
"expected": [
|
|
7
|
+
"Flexible Image Transport System"
|
|
8
|
+
],
|
|
9
|
+
"prompt": "I'm a researcher in the FIESTA Astronomy community (part of the 'FAIR Image Data Workflows in Galaxy' community). Which file format should I use for my image datasets?\n\nAnswer briefly. On the last line write exactly one of:\nCOMMUNITY_CHOICE: <the resource(s) my community has agreed on, comma-separated>\nCOMMUNITY_CHOICE: NOT_DECLARED (my community has explicitly not agreed on one)\nCOMMUNITY_CHOICE: DONT_KNOW (you cannot tell what my community agreed)",
|
|
10
|
+
"condition": "B",
|
|
11
|
+
"run": 2,
|
|
12
|
+
"model": "claude-opus-5-5",
|
|
13
|
+
"toolsAvailable": [
|
|
14
|
+
"CronCreate",
|
|
15
|
+
"CronDelete",
|
|
16
|
+
"CronList",
|
|
17
|
+
"DesignSync",
|
|
18
|
+
"EnterWorktree",
|
|
19
|
+
"ExitWorktree",
|
|
20
|
+
"ListAgents",
|
|
21
|
+
"ListMcpResourcesTool",
|
|
22
|
+
"Monitor",
|
|
23
|
+
"PushNotification",
|
|
24
|
+
"ReadMcpResourceDirTool",
|
|
25
|
+
"ReadMcpResourceTool",
|
|
26
|
+
"RemoteTrigger",
|
|
27
|
+
"ReportFindings",
|
|
28
|
+
"ScheduleWakeup",
|
|
29
|
+
"SendMessage",
|
|
30
|
+
"TaskStop",
|
|
31
|
+
"ToolSearch",
|
|
32
|
+
"Workflow",
|
|
33
|
+
"mcp__fip__check",
|
|
34
|
+
"mcp__fip__communities",
|
|
35
|
+
"mcp__fip__crosswalk",
|
|
36
|
+
"mcp__fip__profile",
|
|
37
|
+
"mcp__fip__recommend"
|
|
38
|
+
],
|
|
39
|
+
"mcpServers": [
|
|
40
|
+
{
|
|
41
|
+
"name": "fip",
|
|
42
|
+
"status": "connected",
|
|
43
|
+
"source": "dynamic"
|
|
44
|
+
}
|
|
45
|
+
],
|
|
46
|
+
"toolCalls": [
|
|
47
|
+
"ToolSearch",
|
|
48
|
+
"mcp__fip__communities",
|
|
49
|
+
"mcp__fip__recommend"
|
|
50
|
+
],
|
|
51
|
+
"answer": "Use **FITS (Flexible Image Transport System)** for your image datasets. Your community's FAIR Implementation Profile (FIESTA Astro FIP) lists it as the agreed format for data. It's the standard astronomy format, built for scientific images, and it can store photometric and spatial calibration information alongside the pixels.\n\nFor metadata records, the same profile lists XML and RDF.\n\nCOMMUNITY_CHOICE: Flexible Image Transport System (FITS)",
|
|
52
|
+
"isError": false,
|
|
53
|
+
"costUsd": 0.0574934,
|
|
54
|
+
"seconds": 10.2,
|
|
55
|
+
"stderr": ""
|
|
56
|
+
}
|