claude-code-templates 1.21.13 → 1.21.14
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.
- package/.claude/settings.local.json +8 -2
- package/.claude-plugin/marketplace.json +251 -0
- package/.github/workflows/component-security-validation.yml +129 -0
- package/README.md +13 -6
- package/cli-tool/README.md +56 -0
- package/cli-tool/bin/create-claude-config.js +2 -0
- package/cli-tool/components/.claude-plugin/marketplace.json +92 -0
- package/cli-tool/components/agents/development-tools/flutter-go-reviewer.md +163 -0
- package/cli-tool/components/agents/development-tools/unused-code-cleaner.md +194 -0
- package/cli-tool/components/commands/git-workflow/gemini-review.md +293 -0
- package/cli-tool/components/commands/testing/add-mutation-testing.md +2 -2
- package/cli-tool/components/commands/testing/add-property-based-testing.md +2 -2
- package/cli-tool/components/commands/testing/e2e-setup.md +2 -2
- package/cli-tool/components/commands/testing/generate-test-cases.md +2 -2
- package/cli-tool/components/commands/testing/generate-tests.md +8 -3
- package/cli-tool/components/commands/testing/setup-comprehensive-testing.md +2 -2
- package/cli-tool/components/commands/testing/setup-load-testing.md +2 -2
- package/cli-tool/components/commands/testing/setup-visual-testing.md +2 -2
- package/cli-tool/components/commands/testing/test-automation-orchestrator.md +2 -2
- package/cli-tool/components/commands/testing/test-changelog-automation.md +2 -2
- package/cli-tool/components/commands/testing/test-coverage.md +2 -2
- package/cli-tool/components/commands/testing/test-quality-analyzer.md +2 -2
- package/cli-tool/components/commands/testing/testing_plan_integration.md +2 -2
- package/cli-tool/components/commands/testing/write-tests.md +2 -2
- package/cli-tool/components/commands/utilities/ultra-think.md +10 -5
- package/cli-tool/components/hooks/git/validate-branch-name.json +1 -1
- package/cli-tool/components/mcps/devtools/chrome-devtools.json +9 -0
- package/cli-tool/components/mcps/devtools/grafana.json +15 -0
- package/cli-tool/components/mcps/devtools/pulumi.json +9 -0
- package/cli-tool/components/mcps/devtools/terraform.json +1 -1
- package/cli-tool/components/settings/statusline/context-monitor.py +1 -1
- package/cli-tool/components/skills/ANTHROPIC_ATTRIBUTION.md +81 -0
- package/cli-tool/components/skills/creative-design/algorithmic-art/LICENSE.txt +202 -0
- package/cli-tool/components/skills/creative-design/algorithmic-art/SKILL.md +405 -0
- package/cli-tool/components/skills/creative-design/algorithmic-art/templates/generator_template.js +223 -0
- package/cli-tool/components/skills/creative-design/algorithmic-art/templates/viewer.html +599 -0
- package/cli-tool/components/skills/creative-design/canvas-design/LICENSE.txt +202 -0
- package/cli-tool/components/skills/creative-design/canvas-design/SKILL.md +130 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/ArsenalSC-OFL.txt +93 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/BigShoulders-Bold.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/BigShoulders-OFL.txt +93 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/BigShoulders-Regular.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/Boldonse-OFL.txt +93 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/Boldonse-Regular.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt +93 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/CrimsonPro-OFL.txt +93 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/DMMono-OFL.txt +93 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/DMMono-Regular.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/EricaOne-OFL.txt +94 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/EricaOne-Regular.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/GeistMono-Bold.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/GeistMono-OFL.txt +93 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/GeistMono-Regular.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/Gloock-OFL.txt +93 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/Gloock-Regular.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/IBMPlexMono-OFL.txt +93 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/InstrumentSans-OFL.txt +93 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/Italiana-OFL.txt +93 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/Italiana-Regular.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/JetBrainsMono-OFL.txt +93 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/Jura-Light.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/Jura-Medium.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/Jura-OFL.txt +93 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/LibreBaskerville-OFL.txt +93 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/Lora-Bold.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/Lora-BoldItalic.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/Lora-Italic.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/Lora-OFL.txt +93 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/Lora-Regular.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/NationalPark-Bold.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/NationalPark-OFL.txt +93 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/NationalPark-Regular.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/NothingYouCouldDo-OFL.txt +93 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/Outfit-Bold.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/Outfit-OFL.txt +93 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/Outfit-Regular.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/PixelifySans-Medium.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/PixelifySans-OFL.txt +93 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/PoiretOne-OFL.txt +93 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/PoiretOne-Regular.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/RedHatMono-Bold.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/RedHatMono-OFL.txt +93 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/RedHatMono-Regular.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/Silkscreen-OFL.txt +93 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/Silkscreen-Regular.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/SmoochSans-Medium.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/SmoochSans-OFL.txt +93 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/Tektur-Medium.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/Tektur-OFL.txt +93 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/Tektur-Regular.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/WorkSans-Bold.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/WorkSans-Italic.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/WorkSans-OFL.txt +93 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/WorkSans-Regular.ttf +0 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/YoungSerif-OFL.txt +93 -0
- package/cli-tool/components/skills/creative-design/canvas-design/canvas-fonts/YoungSerif-Regular.ttf +0 -0
- package/cli-tool/components/skills/creative-design/slack-gif-creator/LICENSE.txt +202 -0
- package/cli-tool/components/skills/creative-design/slack-gif-creator/SKILL.md +646 -0
- package/cli-tool/components/skills/creative-design/slack-gif-creator/core/color_palettes.py +302 -0
- package/cli-tool/components/skills/creative-design/slack-gif-creator/core/easing.py +230 -0
- package/cli-tool/components/skills/creative-design/slack-gif-creator/core/frame_composer.py +469 -0
- package/cli-tool/components/skills/creative-design/slack-gif-creator/core/gif_builder.py +246 -0
- package/cli-tool/components/skills/creative-design/slack-gif-creator/core/typography.py +357 -0
- package/cli-tool/components/skills/creative-design/slack-gif-creator/core/validators.py +264 -0
- package/cli-tool/components/skills/creative-design/slack-gif-creator/core/visual_effects.py +494 -0
- package/cli-tool/components/skills/creative-design/slack-gif-creator/requirements.txt +4 -0
- package/cli-tool/components/skills/creative-design/slack-gif-creator/templates/bounce.py +106 -0
- package/cli-tool/components/skills/creative-design/slack-gif-creator/templates/explode.py +331 -0
- package/cli-tool/components/skills/creative-design/slack-gif-creator/templates/fade.py +329 -0
- package/cli-tool/components/skills/creative-design/slack-gif-creator/templates/flip.py +291 -0
- package/cli-tool/components/skills/creative-design/slack-gif-creator/templates/kaleidoscope.py +211 -0
- package/cli-tool/components/skills/creative-design/slack-gif-creator/templates/morph.py +329 -0
- package/cli-tool/components/skills/creative-design/slack-gif-creator/templates/move.py +293 -0
- package/cli-tool/components/skills/creative-design/slack-gif-creator/templates/pulse.py +268 -0
- package/cli-tool/components/skills/creative-design/slack-gif-creator/templates/shake.py +127 -0
- package/cli-tool/components/skills/creative-design/slack-gif-creator/templates/slide.py +291 -0
- package/cli-tool/components/skills/creative-design/slack-gif-creator/templates/spin.py +269 -0
- package/cli-tool/components/skills/creative-design/slack-gif-creator/templates/wiggle.py +300 -0
- package/cli-tool/components/skills/creative-design/slack-gif-creator/templates/zoom.py +312 -0
- package/cli-tool/components/skills/creative-design/theme-factory/LICENSE.txt +202 -0
- package/cli-tool/components/skills/creative-design/theme-factory/SKILL.md +59 -0
- package/cli-tool/components/skills/creative-design/theme-factory/theme-showcase.pdf +0 -0
- package/cli-tool/components/skills/creative-design/theme-factory/themes/arctic-frost.md +19 -0
- package/cli-tool/components/skills/creative-design/theme-factory/themes/botanical-garden.md +19 -0
- package/cli-tool/components/skills/creative-design/theme-factory/themes/desert-rose.md +19 -0
- package/cli-tool/components/skills/creative-design/theme-factory/themes/forest-canopy.md +19 -0
- package/cli-tool/components/skills/creative-design/theme-factory/themes/golden-hour.md +19 -0
- package/cli-tool/components/skills/creative-design/theme-factory/themes/midnight-galaxy.md +19 -0
- package/cli-tool/components/skills/creative-design/theme-factory/themes/modern-minimalist.md +19 -0
- package/cli-tool/components/skills/creative-design/theme-factory/themes/ocean-depths.md +19 -0
- package/cli-tool/components/skills/creative-design/theme-factory/themes/sunset-boulevard.md +19 -0
- package/cli-tool/components/skills/creative-design/theme-factory/themes/tech-innovation.md +19 -0
- package/cli-tool/components/skills/development/artifacts-builder/LICENSE.txt +202 -0
- package/cli-tool/components/skills/development/artifacts-builder/SKILL.md +74 -0
- package/cli-tool/components/skills/development/artifacts-builder/scripts/bundle-artifact.sh +54 -0
- package/cli-tool/components/skills/development/artifacts-builder/scripts/init-artifact.sh +322 -0
- package/cli-tool/components/skills/development/artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
- package/cli-tool/components/skills/development/git-commit-helper/SKILL.md +203 -0
- package/cli-tool/components/skills/development/mcp-builder/LICENSE.txt +202 -0
- package/cli-tool/components/skills/development/mcp-builder/SKILL.md +328 -0
- package/cli-tool/components/skills/development/mcp-builder/reference/evaluation.md +602 -0
- package/cli-tool/components/skills/development/mcp-builder/reference/mcp_best_practices.md +915 -0
- package/cli-tool/components/skills/development/mcp-builder/reference/node_mcp_server.md +916 -0
- package/cli-tool/components/skills/development/mcp-builder/reference/python_mcp_server.md +752 -0
- package/cli-tool/components/skills/development/mcp-builder/scripts/connections.py +151 -0
- package/cli-tool/components/skills/development/mcp-builder/scripts/evaluation.py +373 -0
- package/cli-tool/components/skills/development/mcp-builder/scripts/example_evaluation.xml +22 -0
- package/cli-tool/components/skills/development/mcp-builder/scripts/requirements.txt +2 -0
- package/cli-tool/components/skills/development/skill-creator/LICENSE.txt +202 -0
- package/cli-tool/components/skills/development/skill-creator/SKILL.md +209 -0
- package/cli-tool/components/skills/development/skill-creator/scripts/init_skill.py +303 -0
- package/cli-tool/components/skills/development/skill-creator/scripts/package_skill.py +110 -0
- package/cli-tool/components/skills/development/skill-creator/scripts/quick_validate.py +65 -0
- package/cli-tool/components/skills/development/webapp-testing/LICENSE.txt +202 -0
- package/cli-tool/components/skills/development/webapp-testing/SKILL.md +96 -0
- package/cli-tool/components/skills/development/webapp-testing/examples/console_logging.py +35 -0
- package/cli-tool/components/skills/development/webapp-testing/examples/element_discovery.py +40 -0
- package/cli-tool/components/skills/development/webapp-testing/examples/static_html_automation.py +33 -0
- package/cli-tool/components/skills/development/webapp-testing/scripts/with_server.py +106 -0
- package/cli-tool/components/skills/document-processing/docx/LICENSE.txt +30 -0
- package/cli-tool/components/skills/document-processing/docx/SKILL.md +197 -0
- package/cli-tool/components/skills/document-processing/docx/docx-js.md +350 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/mce/mc.xsd +75 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/microsoft/wml-2010.xsd +560 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/microsoft/wml-2012.xsd +67 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/microsoft/wml-2018.xsd +14 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/microsoft/wml-cex-2018.xsd +20 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/microsoft/wml-cid-2016.xsd +13 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/schemas/microsoft/wml-symex-2015.xsd +8 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/scripts/pack.py +159 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/scripts/unpack.py +29 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/scripts/validate.py +69 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/scripts/validation/__init__.py +15 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/scripts/validation/base.py +951 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/scripts/validation/docx.py +274 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/scripts/validation/pptx.py +315 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml/scripts/validation/redlining.py +279 -0
- package/cli-tool/components/skills/document-processing/docx/ooxml.md +610 -0
- package/cli-tool/components/skills/document-processing/docx/scripts/__init__.py +1 -0
- package/cli-tool/components/skills/document-processing/docx/scripts/document.py +1276 -0
- package/cli-tool/components/skills/document-processing/docx/scripts/templates/comments.xml +3 -0
- package/cli-tool/components/skills/document-processing/docx/scripts/templates/commentsExtended.xml +3 -0
- package/cli-tool/components/skills/document-processing/docx/scripts/templates/commentsExtensible.xml +3 -0
- package/cli-tool/components/skills/document-processing/docx/scripts/templates/commentsIds.xml +3 -0
- package/cli-tool/components/skills/document-processing/docx/scripts/templates/people.xml +3 -0
- package/cli-tool/components/skills/document-processing/docx/scripts/utilities.py +374 -0
- package/cli-tool/components/skills/document-processing/pdf-anthropic/LICENSE.txt +30 -0
- package/cli-tool/components/skills/document-processing/pdf-anthropic/SKILL.md +294 -0
- package/cli-tool/components/skills/document-processing/pdf-anthropic/forms.md +205 -0
- package/cli-tool/components/skills/document-processing/pdf-anthropic/reference.md +612 -0
- package/cli-tool/components/skills/document-processing/pdf-anthropic/scripts/check_bounding_boxes.py +70 -0
- package/cli-tool/components/skills/document-processing/pdf-anthropic/scripts/check_bounding_boxes_test.py +226 -0
- package/cli-tool/components/skills/document-processing/pdf-anthropic/scripts/check_fillable_fields.py +12 -0
- package/cli-tool/components/skills/document-processing/pdf-anthropic/scripts/convert_pdf_to_images.py +35 -0
- package/cli-tool/components/skills/document-processing/pdf-anthropic/scripts/create_validation_image.py +41 -0
- package/cli-tool/components/skills/document-processing/pdf-anthropic/scripts/extract_form_field_info.py +152 -0
- package/cli-tool/components/skills/document-processing/pdf-anthropic/scripts/fill_fillable_fields.py +114 -0
- package/cli-tool/components/skills/document-processing/pdf-anthropic/scripts/fill_pdf_form_with_annotations.py +108 -0
- package/cli-tool/components/skills/document-processing/pdf-processing/FORMS.md +143 -0
- package/cli-tool/components/skills/document-processing/pdf-processing/SKILL.md +149 -0
- package/cli-tool/components/skills/document-processing/pdf-processing-pro/FORMS.md +610 -0
- package/cli-tool/components/skills/document-processing/pdf-processing-pro/OCR.md +137 -0
- package/cli-tool/components/skills/document-processing/pdf-processing-pro/SKILL.md +296 -0
- package/cli-tool/components/skills/document-processing/pdf-processing-pro/TABLES.md +626 -0
- package/cli-tool/components/skills/document-processing/pdf-processing-pro/scripts/analyze_form.py +307 -0
- package/cli-tool/components/skills/document-processing/pptx/LICENSE.txt +30 -0
- package/cli-tool/components/skills/document-processing/pptx/SKILL.md +484 -0
- package/cli-tool/components/skills/document-processing/pptx/html2pptx.md +625 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/mce/mc.xsd +75 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/microsoft/wml-2010.xsd +560 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/microsoft/wml-2012.xsd +67 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/microsoft/wml-2018.xsd +14 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/microsoft/wml-cex-2018.xsd +20 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/microsoft/wml-cid-2016.xsd +13 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/schemas/microsoft/wml-symex-2015.xsd +8 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/scripts/pack.py +159 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/scripts/unpack.py +29 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/scripts/validate.py +69 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/scripts/validation/__init__.py +15 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/scripts/validation/base.py +951 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/scripts/validation/docx.py +274 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/scripts/validation/pptx.py +315 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml/scripts/validation/redlining.py +279 -0
- package/cli-tool/components/skills/document-processing/pptx/ooxml.md +427 -0
- package/cli-tool/components/skills/document-processing/pptx/scripts/html2pptx.js +979 -0
- package/cli-tool/components/skills/document-processing/pptx/scripts/inventory.py +1020 -0
- package/cli-tool/components/skills/document-processing/pptx/scripts/rearrange.py +231 -0
- package/cli-tool/components/skills/document-processing/pptx/scripts/replace.py +385 -0
- package/cli-tool/components/skills/document-processing/pptx/scripts/thumbnail.py +450 -0
- package/cli-tool/components/skills/document-processing/xlsx/LICENSE.txt +30 -0
- package/cli-tool/components/skills/document-processing/xlsx/SKILL.md +289 -0
- package/cli-tool/components/skills/document-processing/xlsx/recalc.py +178 -0
- package/cli-tool/components/skills/enterprise-communication/brand-guidelines/LICENSE.txt +202 -0
- package/cli-tool/components/skills/enterprise-communication/brand-guidelines/SKILL.md +73 -0
- package/cli-tool/components/skills/enterprise-communication/email-composer/SKILL.md +317 -0
- package/cli-tool/components/skills/enterprise-communication/excel-analysis/SKILL.md +247 -0
- package/cli-tool/components/skills/enterprise-communication/internal-comms/LICENSE.txt +202 -0
- package/cli-tool/components/skills/enterprise-communication/internal-comms/SKILL.md +32 -0
- package/cli-tool/components/skills/enterprise-communication/internal-comms/examples/3p-updates.md +47 -0
- package/cli-tool/components/skills/enterprise-communication/internal-comms/examples/company-newsletter.md +65 -0
- package/cli-tool/components/skills/enterprise-communication/internal-comms/examples/faq-answers.md +30 -0
- package/cli-tool/components/skills/enterprise-communication/internal-comms/examples/general-comms.md +16 -0
- package/cli-tool/package-lock.json +39 -16
- package/cli-tool/package.json +7 -2
- package/cli-tool/security-report.json +62361 -0
- package/cli-tool/src/analytics-web/chats_mobile.html +17 -16
- package/cli-tool/src/console-bridge.js +3 -3
- package/cli-tool/src/index.js +157 -10
- package/cli-tool/src/plugin-dashboard-web/app.js +806 -0
- package/cli-tool/src/plugin-dashboard-web/index.html +292 -0
- package/cli-tool/src/plugin-dashboard-web/styles.css +1781 -0
- package/cli-tool/src/plugin-dashboard.js +689 -0
- package/cli-tool/src/security-audit.js +164 -0
- package/cli-tool/src/validation/ARCHITECTURE.md +309 -0
- package/cli-tool/src/validation/BaseValidator.js +152 -0
- package/cli-tool/src/validation/README.md +543 -0
- package/cli-tool/src/validation/ValidationOrchestrator.js +305 -0
- package/cli-tool/src/validation/validators/IntegrityValidator.js +338 -0
- package/cli-tool/src/validation/validators/ProvenanceValidator.js +399 -0
- package/cli-tool/src/validation/validators/ReferenceValidator.js +373 -0
- package/cli-tool/src/validation/validators/SemanticValidator.js +449 -0
- package/cli-tool/src/validation/validators/StructuralValidator.js +376 -0
- package/docs/CLAUDE.md +363 -0
- package/docs/api/README.md +297 -0
- package/docs/api/package.json +7 -0
- package/docs/api/track-download-supabase.js +150 -0
- package/docs/blog/README.md +199 -0
- package/docs/blog/blog-articles.json +133 -0
- package/docs/blog/css/blog-controls.css +254 -0
- package/docs/blog/e2b-claude-code-sandbox/index.html +8 -0
- package/docs/blog/index.html +81 -124
- package/docs/blog/js/blog-loader.js +602 -0
- package/docs/blog/nextjs-vercel-claude-code-integration/index.html +8 -0
- package/docs/blog/supabase-claude-code-integration/index.html +8 -0
- package/docs/component.html +226 -48
- package/docs/components.json +61610 -604
- package/docs/css/blog.css +292 -0
- package/docs/css/component-page.css +840 -3
- package/docs/css/plugin-page.css +648 -0
- package/docs/css/styles.css +504 -1
- package/docs/css/trending.css +110 -6
- package/docs/download-stats.html +8 -0
- package/docs/index.html +48 -22
- package/docs/jobs.html +8 -0
- package/docs/js/cart-manager.js +21 -8
- package/docs/js/component-page.js +1013 -12
- package/docs/js/data-loader.js +11 -8
- package/docs/js/index-events.js +305 -53
- package/docs/js/plugin-page.js +390 -0
- package/docs/js/script.js +50 -3
- package/docs/js/search-functionality.js +19 -16
- package/docs/js/trending.js +55 -20
- package/docs/plugin.html +262 -0
- package/docs/sandbox-interface.html +8 -0
- package/docs/static/favicon/about.txt +6 -0
- package/docs/static/favicon/android-chrome-192x192.png +0 -0
- package/docs/static/favicon/android-chrome-512x512.png +0 -0
- package/docs/static/favicon/apple-touch-icon.png +0 -0
- package/docs/static/favicon/favicon-16x16.png +0 -0
- package/docs/static/favicon/favicon-32x32.png +0 -0
- package/docs/static/favicon/favicon.ico +0 -0
- package/docs/static/favicon/site.webmanifest +1 -0
- package/docs/trending-data.json +616 -579
- package/docs/trending.html +24 -3
- package/docs/vercel.json +12 -0
- package/docs/workflows.html +8 -0
- package/generate_components_json.py +386 -11
- package/package.json +1 -1
- package/sync-api.sh +50 -0
- package/vercel.json +10 -75
- package/ROADMAP.md +0 -278
- package/test_serpapi.py +0 -36
- /package/cli-tool/components/commands/svelte/{svelte:a11y.md → svelte-a11y.md} +0 -0
- /package/cli-tool/components/commands/svelte/{svelte:component.md → svelte-component.md} +0 -0
- /package/cli-tool/components/commands/svelte/{svelte:debug.md → svelte-debug.md} +0 -0
- /package/cli-tool/components/commands/svelte/{svelte:migrate.md → svelte-migrate.md} +0 -0
- /package/cli-tool/components/commands/svelte/{svelte:optimize.md → svelte-optimize.md} +0 -0
- /package/cli-tool/components/commands/svelte/{svelte:scaffold.md → svelte-scaffold.md} +0 -0
- /package/cli-tool/components/commands/svelte/{svelte:storybook-migrate.md → svelte-storybook-migrate.md} +0 -0
- /package/cli-tool/components/commands/svelte/{svelte:storybook-mock.md → svelte-storybook-mock.md} +0 -0
- /package/cli-tool/components/commands/svelte/{svelte:storybook-setup.md → svelte-storybook-setup.md} +0 -0
- /package/cli-tool/components/commands/svelte/{svelte:storybook-story.md → svelte-storybook-story.md} +0 -0
- /package/cli-tool/components/commands/svelte/{svelte:storybook-troubleshoot.md → svelte-storybook-troubleshoot.md} +0 -0
- /package/cli-tool/components/commands/svelte/{svelte:storybook.md → svelte-storybook.md} +0 -0
- /package/cli-tool/components/commands/svelte/{svelte:test-coverage.md → svelte-test-coverage.md} +0 -0
- /package/cli-tool/components/commands/svelte/{svelte:test-fix.md → svelte-test-fix.md} +0 -0
- /package/cli-tool/components/commands/svelte/{svelte:test-setup.md → svelte-test-setup.md} +0 -0
- /package/cli-tool/components/commands/svelte/{svelte:test.md → svelte-test.md} +0 -0
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
"""Lightweight connection handling for MCP servers."""
|
|
2
|
+
|
|
3
|
+
from abc import ABC, abstractmethod
|
|
4
|
+
from contextlib import AsyncExitStack
|
|
5
|
+
from typing import Any
|
|
6
|
+
|
|
7
|
+
from mcp import ClientSession, StdioServerParameters
|
|
8
|
+
from mcp.client.sse import sse_client
|
|
9
|
+
from mcp.client.stdio import stdio_client
|
|
10
|
+
from mcp.client.streamable_http import streamablehttp_client
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class MCPConnection(ABC):
|
|
14
|
+
"""Base class for MCP server connections."""
|
|
15
|
+
|
|
16
|
+
def __init__(self):
|
|
17
|
+
self.session = None
|
|
18
|
+
self._stack = None
|
|
19
|
+
|
|
20
|
+
@abstractmethod
|
|
21
|
+
def _create_context(self):
|
|
22
|
+
"""Create the connection context based on connection type."""
|
|
23
|
+
|
|
24
|
+
async def __aenter__(self):
|
|
25
|
+
"""Initialize MCP server connection."""
|
|
26
|
+
self._stack = AsyncExitStack()
|
|
27
|
+
await self._stack.__aenter__()
|
|
28
|
+
|
|
29
|
+
try:
|
|
30
|
+
ctx = self._create_context()
|
|
31
|
+
result = await self._stack.enter_async_context(ctx)
|
|
32
|
+
|
|
33
|
+
if len(result) == 2:
|
|
34
|
+
read, write = result
|
|
35
|
+
elif len(result) == 3:
|
|
36
|
+
read, write, _ = result
|
|
37
|
+
else:
|
|
38
|
+
raise ValueError(f"Unexpected context result: {result}")
|
|
39
|
+
|
|
40
|
+
session_ctx = ClientSession(read, write)
|
|
41
|
+
self.session = await self._stack.enter_async_context(session_ctx)
|
|
42
|
+
await self.session.initialize()
|
|
43
|
+
return self
|
|
44
|
+
except BaseException:
|
|
45
|
+
await self._stack.__aexit__(None, None, None)
|
|
46
|
+
raise
|
|
47
|
+
|
|
48
|
+
async def __aexit__(self, exc_type, exc_val, exc_tb):
|
|
49
|
+
"""Clean up MCP server connection resources."""
|
|
50
|
+
if self._stack:
|
|
51
|
+
await self._stack.__aexit__(exc_type, exc_val, exc_tb)
|
|
52
|
+
self.session = None
|
|
53
|
+
self._stack = None
|
|
54
|
+
|
|
55
|
+
async def list_tools(self) -> list[dict[str, Any]]:
|
|
56
|
+
"""Retrieve available tools from the MCP server."""
|
|
57
|
+
response = await self.session.list_tools()
|
|
58
|
+
return [
|
|
59
|
+
{
|
|
60
|
+
"name": tool.name,
|
|
61
|
+
"description": tool.description,
|
|
62
|
+
"input_schema": tool.inputSchema,
|
|
63
|
+
}
|
|
64
|
+
for tool in response.tools
|
|
65
|
+
]
|
|
66
|
+
|
|
67
|
+
async def call_tool(self, tool_name: str, arguments: dict[str, Any]) -> Any:
|
|
68
|
+
"""Call a tool on the MCP server with provided arguments."""
|
|
69
|
+
result = await self.session.call_tool(tool_name, arguments=arguments)
|
|
70
|
+
return result.content
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
class MCPConnectionStdio(MCPConnection):
|
|
74
|
+
"""MCP connection using standard input/output."""
|
|
75
|
+
|
|
76
|
+
def __init__(self, command: str, args: list[str] = None, env: dict[str, str] = None):
|
|
77
|
+
super().__init__()
|
|
78
|
+
self.command = command
|
|
79
|
+
self.args = args or []
|
|
80
|
+
self.env = env
|
|
81
|
+
|
|
82
|
+
def _create_context(self):
|
|
83
|
+
return stdio_client(
|
|
84
|
+
StdioServerParameters(command=self.command, args=self.args, env=self.env)
|
|
85
|
+
)
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
class MCPConnectionSSE(MCPConnection):
|
|
89
|
+
"""MCP connection using Server-Sent Events."""
|
|
90
|
+
|
|
91
|
+
def __init__(self, url: str, headers: dict[str, str] = None):
|
|
92
|
+
super().__init__()
|
|
93
|
+
self.url = url
|
|
94
|
+
self.headers = headers or {}
|
|
95
|
+
|
|
96
|
+
def _create_context(self):
|
|
97
|
+
return sse_client(url=self.url, headers=self.headers)
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
class MCPConnectionHTTP(MCPConnection):
|
|
101
|
+
"""MCP connection using Streamable HTTP."""
|
|
102
|
+
|
|
103
|
+
def __init__(self, url: str, headers: dict[str, str] = None):
|
|
104
|
+
super().__init__()
|
|
105
|
+
self.url = url
|
|
106
|
+
self.headers = headers or {}
|
|
107
|
+
|
|
108
|
+
def _create_context(self):
|
|
109
|
+
return streamablehttp_client(url=self.url, headers=self.headers)
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
def create_connection(
|
|
113
|
+
transport: str,
|
|
114
|
+
command: str = None,
|
|
115
|
+
args: list[str] = None,
|
|
116
|
+
env: dict[str, str] = None,
|
|
117
|
+
url: str = None,
|
|
118
|
+
headers: dict[str, str] = None,
|
|
119
|
+
) -> MCPConnection:
|
|
120
|
+
"""Factory function to create the appropriate MCP connection.
|
|
121
|
+
|
|
122
|
+
Args:
|
|
123
|
+
transport: Connection type ("stdio", "sse", or "http")
|
|
124
|
+
command: Command to run (stdio only)
|
|
125
|
+
args: Command arguments (stdio only)
|
|
126
|
+
env: Environment variables (stdio only)
|
|
127
|
+
url: Server URL (sse and http only)
|
|
128
|
+
headers: HTTP headers (sse and http only)
|
|
129
|
+
|
|
130
|
+
Returns:
|
|
131
|
+
MCPConnection instance
|
|
132
|
+
"""
|
|
133
|
+
transport = transport.lower()
|
|
134
|
+
|
|
135
|
+
if transport == "stdio":
|
|
136
|
+
if not command:
|
|
137
|
+
raise ValueError("Command is required for stdio transport")
|
|
138
|
+
return MCPConnectionStdio(command=command, args=args, env=env)
|
|
139
|
+
|
|
140
|
+
elif transport == "sse":
|
|
141
|
+
if not url:
|
|
142
|
+
raise ValueError("URL is required for sse transport")
|
|
143
|
+
return MCPConnectionSSE(url=url, headers=headers)
|
|
144
|
+
|
|
145
|
+
elif transport in ["http", "streamable_http", "streamable-http"]:
|
|
146
|
+
if not url:
|
|
147
|
+
raise ValueError("URL is required for http transport")
|
|
148
|
+
return MCPConnectionHTTP(url=url, headers=headers)
|
|
149
|
+
|
|
150
|
+
else:
|
|
151
|
+
raise ValueError(f"Unsupported transport type: {transport}. Use 'stdio', 'sse', or 'http'")
|
|
@@ -0,0 +1,373 @@
|
|
|
1
|
+
"""MCP Server Evaluation Harness
|
|
2
|
+
|
|
3
|
+
This script evaluates MCP servers by running test questions against them using Claude.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
import argparse
|
|
7
|
+
import asyncio
|
|
8
|
+
import json
|
|
9
|
+
import re
|
|
10
|
+
import sys
|
|
11
|
+
import time
|
|
12
|
+
import traceback
|
|
13
|
+
import xml.etree.ElementTree as ET
|
|
14
|
+
from pathlib import Path
|
|
15
|
+
from typing import Any
|
|
16
|
+
|
|
17
|
+
from anthropic import Anthropic
|
|
18
|
+
|
|
19
|
+
from connections import create_connection
|
|
20
|
+
|
|
21
|
+
EVALUATION_PROMPT = """You are an AI assistant with access to tools.
|
|
22
|
+
|
|
23
|
+
When given a task, you MUST:
|
|
24
|
+
1. Use the available tools to complete the task
|
|
25
|
+
2. Provide summary of each step in your approach, wrapped in <summary> tags
|
|
26
|
+
3. Provide feedback on the tools provided, wrapped in <feedback> tags
|
|
27
|
+
4. Provide your final response, wrapped in <response> tags
|
|
28
|
+
|
|
29
|
+
Summary Requirements:
|
|
30
|
+
- In your <summary> tags, you must explain:
|
|
31
|
+
- The steps you took to complete the task
|
|
32
|
+
- Which tools you used, in what order, and why
|
|
33
|
+
- The inputs you provided to each tool
|
|
34
|
+
- The outputs you received from each tool
|
|
35
|
+
- A summary for how you arrived at the response
|
|
36
|
+
|
|
37
|
+
Feedback Requirements:
|
|
38
|
+
- In your <feedback> tags, provide constructive feedback on the tools:
|
|
39
|
+
- Comment on tool names: Are they clear and descriptive?
|
|
40
|
+
- Comment on input parameters: Are they well-documented? Are required vs optional parameters clear?
|
|
41
|
+
- Comment on descriptions: Do they accurately describe what the tool does?
|
|
42
|
+
- Comment on any errors encountered during tool usage: Did the tool fail to execute? Did the tool return too many tokens?
|
|
43
|
+
- Identify specific areas for improvement and explain WHY they would help
|
|
44
|
+
- Be specific and actionable in your suggestions
|
|
45
|
+
|
|
46
|
+
Response Requirements:
|
|
47
|
+
- Your response should be concise and directly address what was asked
|
|
48
|
+
- Always wrap your final response in <response> tags
|
|
49
|
+
- If you cannot solve the task return <response>NOT_FOUND</response>
|
|
50
|
+
- For numeric responses, provide just the number
|
|
51
|
+
- For IDs, provide just the ID
|
|
52
|
+
- For names or text, provide the exact text requested
|
|
53
|
+
- Your response should go last"""
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def parse_evaluation_file(file_path: Path) -> list[dict[str, Any]]:
|
|
57
|
+
"""Parse XML evaluation file with qa_pair elements."""
|
|
58
|
+
try:
|
|
59
|
+
tree = ET.parse(file_path)
|
|
60
|
+
root = tree.getroot()
|
|
61
|
+
evaluations = []
|
|
62
|
+
|
|
63
|
+
for qa_pair in root.findall(".//qa_pair"):
|
|
64
|
+
question_elem = qa_pair.find("question")
|
|
65
|
+
answer_elem = qa_pair.find("answer")
|
|
66
|
+
|
|
67
|
+
if question_elem is not None and answer_elem is not None:
|
|
68
|
+
evaluations.append({
|
|
69
|
+
"question": (question_elem.text or "").strip(),
|
|
70
|
+
"answer": (answer_elem.text or "").strip(),
|
|
71
|
+
})
|
|
72
|
+
|
|
73
|
+
return evaluations
|
|
74
|
+
except Exception as e:
|
|
75
|
+
print(f"Error parsing evaluation file {file_path}: {e}")
|
|
76
|
+
return []
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def extract_xml_content(text: str, tag: str) -> str | None:
|
|
80
|
+
"""Extract content from XML tags."""
|
|
81
|
+
pattern = rf"<{tag}>(.*?)</{tag}>"
|
|
82
|
+
matches = re.findall(pattern, text, re.DOTALL)
|
|
83
|
+
return matches[-1].strip() if matches else None
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
async def agent_loop(
|
|
87
|
+
client: Anthropic,
|
|
88
|
+
model: str,
|
|
89
|
+
question: str,
|
|
90
|
+
tools: list[dict[str, Any]],
|
|
91
|
+
connection: Any,
|
|
92
|
+
) -> tuple[str, dict[str, Any]]:
|
|
93
|
+
"""Run the agent loop with MCP tools."""
|
|
94
|
+
messages = [{"role": "user", "content": question}]
|
|
95
|
+
|
|
96
|
+
response = await asyncio.to_thread(
|
|
97
|
+
client.messages.create,
|
|
98
|
+
model=model,
|
|
99
|
+
max_tokens=4096,
|
|
100
|
+
system=EVALUATION_PROMPT,
|
|
101
|
+
messages=messages,
|
|
102
|
+
tools=tools,
|
|
103
|
+
)
|
|
104
|
+
|
|
105
|
+
messages.append({"role": "assistant", "content": response.content})
|
|
106
|
+
|
|
107
|
+
tool_metrics = {}
|
|
108
|
+
|
|
109
|
+
while response.stop_reason == "tool_use":
|
|
110
|
+
tool_use = next(block for block in response.content if block.type == "tool_use")
|
|
111
|
+
tool_name = tool_use.name
|
|
112
|
+
tool_input = tool_use.input
|
|
113
|
+
|
|
114
|
+
tool_start_ts = time.time()
|
|
115
|
+
try:
|
|
116
|
+
tool_result = await connection.call_tool(tool_name, tool_input)
|
|
117
|
+
tool_response = json.dumps(tool_result) if isinstance(tool_result, (dict, list)) else str(tool_result)
|
|
118
|
+
except Exception as e:
|
|
119
|
+
tool_response = f"Error executing tool {tool_name}: {str(e)}\n"
|
|
120
|
+
tool_response += traceback.format_exc()
|
|
121
|
+
tool_duration = time.time() - tool_start_ts
|
|
122
|
+
|
|
123
|
+
if tool_name not in tool_metrics:
|
|
124
|
+
tool_metrics[tool_name] = {"count": 0, "durations": []}
|
|
125
|
+
tool_metrics[tool_name]["count"] += 1
|
|
126
|
+
tool_metrics[tool_name]["durations"].append(tool_duration)
|
|
127
|
+
|
|
128
|
+
messages.append({
|
|
129
|
+
"role": "user",
|
|
130
|
+
"content": [{
|
|
131
|
+
"type": "tool_result",
|
|
132
|
+
"tool_use_id": tool_use.id,
|
|
133
|
+
"content": tool_response,
|
|
134
|
+
}]
|
|
135
|
+
})
|
|
136
|
+
|
|
137
|
+
response = await asyncio.to_thread(
|
|
138
|
+
client.messages.create,
|
|
139
|
+
model=model,
|
|
140
|
+
max_tokens=4096,
|
|
141
|
+
system=EVALUATION_PROMPT,
|
|
142
|
+
messages=messages,
|
|
143
|
+
tools=tools,
|
|
144
|
+
)
|
|
145
|
+
messages.append({"role": "assistant", "content": response.content})
|
|
146
|
+
|
|
147
|
+
response_text = next(
|
|
148
|
+
(block.text for block in response.content if hasattr(block, "text")),
|
|
149
|
+
None,
|
|
150
|
+
)
|
|
151
|
+
return response_text, tool_metrics
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
async def evaluate_single_task(
|
|
155
|
+
client: Anthropic,
|
|
156
|
+
model: str,
|
|
157
|
+
qa_pair: dict[str, Any],
|
|
158
|
+
tools: list[dict[str, Any]],
|
|
159
|
+
connection: Any,
|
|
160
|
+
task_index: int,
|
|
161
|
+
) -> dict[str, Any]:
|
|
162
|
+
"""Evaluate a single QA pair with the given tools."""
|
|
163
|
+
start_time = time.time()
|
|
164
|
+
|
|
165
|
+
print(f"Task {task_index + 1}: Running task with question: {qa_pair['question']}")
|
|
166
|
+
response, tool_metrics = await agent_loop(client, model, qa_pair["question"], tools, connection)
|
|
167
|
+
|
|
168
|
+
response_value = extract_xml_content(response, "response")
|
|
169
|
+
summary = extract_xml_content(response, "summary")
|
|
170
|
+
feedback = extract_xml_content(response, "feedback")
|
|
171
|
+
|
|
172
|
+
duration_seconds = time.time() - start_time
|
|
173
|
+
|
|
174
|
+
return {
|
|
175
|
+
"question": qa_pair["question"],
|
|
176
|
+
"expected": qa_pair["answer"],
|
|
177
|
+
"actual": response_value,
|
|
178
|
+
"score": int(response_value == qa_pair["answer"]) if response_value else 0,
|
|
179
|
+
"total_duration": duration_seconds,
|
|
180
|
+
"tool_calls": tool_metrics,
|
|
181
|
+
"num_tool_calls": sum(len(metrics["durations"]) for metrics in tool_metrics.values()),
|
|
182
|
+
"summary": summary,
|
|
183
|
+
"feedback": feedback,
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+
REPORT_HEADER = """
|
|
188
|
+
# Evaluation Report
|
|
189
|
+
|
|
190
|
+
## Summary
|
|
191
|
+
|
|
192
|
+
- **Accuracy**: {correct}/{total} ({accuracy:.1f}%)
|
|
193
|
+
- **Average Task Duration**: {average_duration_s:.2f}s
|
|
194
|
+
- **Average Tool Calls per Task**: {average_tool_calls:.2f}
|
|
195
|
+
- **Total Tool Calls**: {total_tool_calls}
|
|
196
|
+
|
|
197
|
+
---
|
|
198
|
+
"""
|
|
199
|
+
|
|
200
|
+
TASK_TEMPLATE = """
|
|
201
|
+
### Task {task_num}
|
|
202
|
+
|
|
203
|
+
**Question**: {question}
|
|
204
|
+
**Ground Truth Answer**: `{expected_answer}`
|
|
205
|
+
**Actual Answer**: `{actual_answer}`
|
|
206
|
+
**Correct**: {correct_indicator}
|
|
207
|
+
**Duration**: {total_duration:.2f}s
|
|
208
|
+
**Tool Calls**: {tool_calls}
|
|
209
|
+
|
|
210
|
+
**Summary**
|
|
211
|
+
{summary}
|
|
212
|
+
|
|
213
|
+
**Feedback**
|
|
214
|
+
{feedback}
|
|
215
|
+
|
|
216
|
+
---
|
|
217
|
+
"""
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
async def run_evaluation(
|
|
221
|
+
eval_path: Path,
|
|
222
|
+
connection: Any,
|
|
223
|
+
model: str = "claude-3-7-sonnet-20250219",
|
|
224
|
+
) -> str:
|
|
225
|
+
"""Run evaluation with MCP server tools."""
|
|
226
|
+
print("🚀 Starting Evaluation")
|
|
227
|
+
|
|
228
|
+
client = Anthropic()
|
|
229
|
+
|
|
230
|
+
tools = await connection.list_tools()
|
|
231
|
+
print(f"📋 Loaded {len(tools)} tools from MCP server")
|
|
232
|
+
|
|
233
|
+
qa_pairs = parse_evaluation_file(eval_path)
|
|
234
|
+
print(f"📋 Loaded {len(qa_pairs)} evaluation tasks")
|
|
235
|
+
|
|
236
|
+
results = []
|
|
237
|
+
for i, qa_pair in enumerate(qa_pairs):
|
|
238
|
+
print(f"Processing task {i + 1}/{len(qa_pairs)}")
|
|
239
|
+
result = await evaluate_single_task(client, model, qa_pair, tools, connection, i)
|
|
240
|
+
results.append(result)
|
|
241
|
+
|
|
242
|
+
correct = sum(r["score"] for r in results)
|
|
243
|
+
accuracy = (correct / len(results)) * 100 if results else 0
|
|
244
|
+
average_duration_s = sum(r["total_duration"] for r in results) / len(results) if results else 0
|
|
245
|
+
average_tool_calls = sum(r["num_tool_calls"] for r in results) / len(results) if results else 0
|
|
246
|
+
total_tool_calls = sum(r["num_tool_calls"] for r in results)
|
|
247
|
+
|
|
248
|
+
report = REPORT_HEADER.format(
|
|
249
|
+
correct=correct,
|
|
250
|
+
total=len(results),
|
|
251
|
+
accuracy=accuracy,
|
|
252
|
+
average_duration_s=average_duration_s,
|
|
253
|
+
average_tool_calls=average_tool_calls,
|
|
254
|
+
total_tool_calls=total_tool_calls,
|
|
255
|
+
)
|
|
256
|
+
|
|
257
|
+
report += "".join([
|
|
258
|
+
TASK_TEMPLATE.format(
|
|
259
|
+
task_num=i + 1,
|
|
260
|
+
question=qa_pair["question"],
|
|
261
|
+
expected_answer=qa_pair["answer"],
|
|
262
|
+
actual_answer=result["actual"] or "N/A",
|
|
263
|
+
correct_indicator="✅" if result["score"] else "❌",
|
|
264
|
+
total_duration=result["total_duration"],
|
|
265
|
+
tool_calls=json.dumps(result["tool_calls"], indent=2),
|
|
266
|
+
summary=result["summary"] or "N/A",
|
|
267
|
+
feedback=result["feedback"] or "N/A",
|
|
268
|
+
)
|
|
269
|
+
for i, (qa_pair, result) in enumerate(zip(qa_pairs, results))
|
|
270
|
+
])
|
|
271
|
+
|
|
272
|
+
return report
|
|
273
|
+
|
|
274
|
+
|
|
275
|
+
def parse_headers(header_list: list[str]) -> dict[str, str]:
|
|
276
|
+
"""Parse header strings in format 'Key: Value' into a dictionary."""
|
|
277
|
+
headers = {}
|
|
278
|
+
if not header_list:
|
|
279
|
+
return headers
|
|
280
|
+
|
|
281
|
+
for header in header_list:
|
|
282
|
+
if ":" in header:
|
|
283
|
+
key, value = header.split(":", 1)
|
|
284
|
+
headers[key.strip()] = value.strip()
|
|
285
|
+
else:
|
|
286
|
+
print(f"Warning: Ignoring malformed header: {header}")
|
|
287
|
+
return headers
|
|
288
|
+
|
|
289
|
+
|
|
290
|
+
def parse_env_vars(env_list: list[str]) -> dict[str, str]:
|
|
291
|
+
"""Parse environment variable strings in format 'KEY=VALUE' into a dictionary."""
|
|
292
|
+
env = {}
|
|
293
|
+
if not env_list:
|
|
294
|
+
return env
|
|
295
|
+
|
|
296
|
+
for env_var in env_list:
|
|
297
|
+
if "=" in env_var:
|
|
298
|
+
key, value = env_var.split("=", 1)
|
|
299
|
+
env[key.strip()] = value.strip()
|
|
300
|
+
else:
|
|
301
|
+
print(f"Warning: Ignoring malformed environment variable: {env_var}")
|
|
302
|
+
return env
|
|
303
|
+
|
|
304
|
+
|
|
305
|
+
async def main():
|
|
306
|
+
parser = argparse.ArgumentParser(
|
|
307
|
+
description="Evaluate MCP servers using test questions",
|
|
308
|
+
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
309
|
+
epilog="""
|
|
310
|
+
Examples:
|
|
311
|
+
# Evaluate a local stdio MCP server
|
|
312
|
+
python evaluation.py -t stdio -c python -a my_server.py eval.xml
|
|
313
|
+
|
|
314
|
+
# Evaluate an SSE MCP server
|
|
315
|
+
python evaluation.py -t sse -u https://example.com/mcp -H "Authorization: Bearer token" eval.xml
|
|
316
|
+
|
|
317
|
+
# Evaluate an HTTP MCP server with custom model
|
|
318
|
+
python evaluation.py -t http -u https://example.com/mcp -m claude-3-5-sonnet-20241022 eval.xml
|
|
319
|
+
""",
|
|
320
|
+
)
|
|
321
|
+
|
|
322
|
+
parser.add_argument("eval_file", type=Path, help="Path to evaluation XML file")
|
|
323
|
+
parser.add_argument("-t", "--transport", choices=["stdio", "sse", "http"], default="stdio", help="Transport type (default: stdio)")
|
|
324
|
+
parser.add_argument("-m", "--model", default="claude-3-7-sonnet-20250219", help="Claude model to use (default: claude-3-7-sonnet-20250219)")
|
|
325
|
+
|
|
326
|
+
stdio_group = parser.add_argument_group("stdio options")
|
|
327
|
+
stdio_group.add_argument("-c", "--command", help="Command to run MCP server (stdio only)")
|
|
328
|
+
stdio_group.add_argument("-a", "--args", nargs="+", help="Arguments for the command (stdio only)")
|
|
329
|
+
stdio_group.add_argument("-e", "--env", nargs="+", help="Environment variables in KEY=VALUE format (stdio only)")
|
|
330
|
+
|
|
331
|
+
remote_group = parser.add_argument_group("sse/http options")
|
|
332
|
+
remote_group.add_argument("-u", "--url", help="MCP server URL (sse/http only)")
|
|
333
|
+
remote_group.add_argument("-H", "--header", nargs="+", dest="headers", help="HTTP headers in 'Key: Value' format (sse/http only)")
|
|
334
|
+
|
|
335
|
+
parser.add_argument("-o", "--output", type=Path, help="Output file for evaluation report (default: stdout)")
|
|
336
|
+
|
|
337
|
+
args = parser.parse_args()
|
|
338
|
+
|
|
339
|
+
if not args.eval_file.exists():
|
|
340
|
+
print(f"Error: Evaluation file not found: {args.eval_file}")
|
|
341
|
+
sys.exit(1)
|
|
342
|
+
|
|
343
|
+
headers = parse_headers(args.headers) if args.headers else None
|
|
344
|
+
env_vars = parse_env_vars(args.env) if args.env else None
|
|
345
|
+
|
|
346
|
+
try:
|
|
347
|
+
connection = create_connection(
|
|
348
|
+
transport=args.transport,
|
|
349
|
+
command=args.command,
|
|
350
|
+
args=args.args,
|
|
351
|
+
env=env_vars,
|
|
352
|
+
url=args.url,
|
|
353
|
+
headers=headers,
|
|
354
|
+
)
|
|
355
|
+
except ValueError as e:
|
|
356
|
+
print(f"Error: {e}")
|
|
357
|
+
sys.exit(1)
|
|
358
|
+
|
|
359
|
+
print(f"🔗 Connecting to MCP server via {args.transport}...")
|
|
360
|
+
|
|
361
|
+
async with connection:
|
|
362
|
+
print("✅ Connected successfully")
|
|
363
|
+
report = await run_evaluation(args.eval_file, connection, args.model)
|
|
364
|
+
|
|
365
|
+
if args.output:
|
|
366
|
+
args.output.write_text(report)
|
|
367
|
+
print(f"\n✅ Report saved to {args.output}")
|
|
368
|
+
else:
|
|
369
|
+
print("\n" + report)
|
|
370
|
+
|
|
371
|
+
|
|
372
|
+
if __name__ == "__main__":
|
|
373
|
+
asyncio.run(main())
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
<evaluation>
|
|
2
|
+
<qa_pair>
|
|
3
|
+
<question>Calculate the compound interest on $10,000 invested at 5% annual interest rate, compounded monthly for 3 years. What is the final amount in dollars (rounded to 2 decimal places)?</question>
|
|
4
|
+
<answer>11614.72</answer>
|
|
5
|
+
</qa_pair>
|
|
6
|
+
<qa_pair>
|
|
7
|
+
<question>A projectile is launched at a 45-degree angle with an initial velocity of 50 m/s. Calculate the total distance (in meters) it has traveled from the launch point after 2 seconds, assuming g=9.8 m/s². Round to 2 decimal places.</question>
|
|
8
|
+
<answer>87.25</answer>
|
|
9
|
+
</qa_pair>
|
|
10
|
+
<qa_pair>
|
|
11
|
+
<question>A sphere has a volume of 500 cubic meters. Calculate its surface area in square meters. Round to 2 decimal places.</question>
|
|
12
|
+
<answer>304.65</answer>
|
|
13
|
+
</qa_pair>
|
|
14
|
+
<qa_pair>
|
|
15
|
+
<question>Calculate the population standard deviation of this dataset: [12, 15, 18, 22, 25, 30, 35]. Round to 2 decimal places.</question>
|
|
16
|
+
<answer>7.61</answer>
|
|
17
|
+
</qa_pair>
|
|
18
|
+
<qa_pair>
|
|
19
|
+
<question>Calculate the pH of a solution with a hydrogen ion concentration of 3.5 × 10^-5 M. Round to 2 decimal places.</question>
|
|
20
|
+
<answer>4.46</answer>
|
|
21
|
+
</qa_pair>
|
|
22
|
+
</evaluation>
|