pyegeria 5.4.0.28__py3-none-any.whl → 5.5.3.3__py3-none-any.whl
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.
Potentially problematic release.
This version of pyegeria might be problematic. Click here for more details.
- commands/__init__.py +24 -0
- commands/cat/Dr-Egeria_md-orig.py +2 -2
- commands/cat/collection_actions.py +197 -0
- commands/cat/dr_egeria_command_help.py +137 -38
- commands/cat/dr_egeria_jupyter.py +7 -7
- commands/cat/dr_egeria_md.py +10 -267
- commands/cat/exp_list_glossaries.py +11 -14
- commands/cat/get_asset_graph.py +37 -267
- commands/cat/{get_collection.py → get_collection_tree.py} +10 -18
- commands/cat/get_project_dependencies.py +14 -14
- commands/cat/get_project_structure.py +15 -14
- commands/cat/get_tech_type_elements.py +16 -116
- commands/cat/glossary_actions.py +145 -298
- commands/cat/list_assets.py +3 -11
- commands/cat/list_cert_types.py +17 -63
- commands/cat/list_collections.py +17 -139
- commands/cat/list_deployed_catalogs.py +15 -27
- commands/cat/list_deployed_database_schemas.py +27 -43
- commands/cat/list_deployed_databases.py +16 -31
- commands/cat/list_deployed_servers.py +35 -54
- commands/cat/list_glossaries.py +18 -17
- commands/cat/list_projects.py +10 -12
- commands/cat/list_tech_type_elements.py +21 -37
- commands/cat/list_tech_types.py +13 -25
- commands/cat/list_terms.py +38 -79
- commands/cat/list_todos.py +4 -11
- commands/cat/list_user_ids.py +3 -10
- commands/cat/my_reports.py +559 -0
- commands/cat/run_report.py +394 -0
- commands/cat/{list_format_set.py → run_report_orig.py} +136 -44
- commands/cli/egeria.py +182 -219
- commands/cli/egeria_cat.py +32 -59
- commands/cli/egeria_my.py +13 -0
- commands/cli/egeria_ops.py +69 -74
- commands/cli/egeria_tech.py +17 -93
- commands/{cat → deprecated}/list_data_designer.py +2 -4
- commands/{cat → deprecated}/list_data_structures_full.py +3 -6
- commands/deprecated/old_get_asset_graph.py +315 -0
- commands/my/__init__.py +0 -2
- commands/my/list_my_profile.py +27 -34
- commands/my/list_my_roles.py +1 -7
- commands/my/monitor_my_todos.py +1 -7
- commands/my/monitor_open_todos.py +6 -7
- commands/my/todo_actions.py +4 -5
- commands/ops/__init__.py +0 -2
- commands/ops/gov_server_actions.py +17 -21
- commands/ops/list_archives.py +17 -38
- commands/ops/list_catalog_targets.py +33 -40
- commands/ops/load_archive.py +14 -11
- commands/ops/{monitor_engine_activity_c.py → monitor_active_engine_activity.py} +51 -82
- commands/ops/{monitor_integ_daemon_status.py → monitor_daemon_status.py} +35 -55
- commands/ops/monitor_engine_activity.py +79 -77
- commands/ops/{monitor_gov_eng_status.py → monitor_engine_status.py} +10 -7
- commands/ops/monitor_platform_status.py +38 -50
- commands/ops/monitor_server_startup.py +6 -11
- commands/ops/monitor_server_status.py +7 -11
- commands/ops/orig_monitor_server_list.py +8 -8
- commands/ops/orig_monitor_server_status.py +1 -5
- commands/ops/refresh_integration_daemon.py +5 -5
- commands/ops/restart_integration_daemon.py +5 -5
- commands/ops/table_integ_daemon_status.py +6 -6
- commands/ops/x_engine_actions.py +7 -7
- commands/tech/__init__.py +0 -2
- commands/tech/{generic_actions.py → element_actions.py} +6 -11
- commands/tech/get_element_info.py +20 -29
- commands/tech/get_guid_info.py +23 -42
- commands/tech/get_tech_details.py +20 -35
- commands/tech/get_tech_type_template.py +28 -39
- commands/tech/list_all_om_type_elements.py +24 -30
- commands/tech/list_all_om_type_elements_x.py +22 -28
- commands/tech/list_all_related_elements.py +19 -28
- commands/tech/list_anchored_elements.py +22 -30
- commands/tech/list_asset_types.py +19 -24
- commands/tech/list_elements_by_classification_by_property_value.py +26 -32
- commands/tech/list_elements_by_property_value.py +19 -25
- commands/tech/list_elements_by_property_value_x.py +20 -28
- commands/tech/list_elements_for_classification.py +28 -41
- commands/tech/list_gov_action_processes.py +16 -27
- commands/tech/list_information_supply_chains.py +22 -30
- commands/tech/list_registered_services.py +14 -26
- commands/tech/list_related_elements_with_prop_value.py +15 -25
- commands/tech/list_related_specification.py +1 -4
- commands/tech/list_relationship_types.py +15 -25
- commands/tech/list_relationships.py +20 -36
- commands/tech/list_solution_blueprints.py +28 -33
- commands/tech/list_solution_components.py +23 -29
- commands/tech/list_solution_roles.py +21 -32
- commands/tech/list_tech_templates.py +51 -54
- commands/tech/list_valid_metadata_values.py +5 -9
- commands/tech/table_tech_templates.py +2 -6
- commands/tech/x_list_related_elements.py +1 -4
- examples/GeoSpatial Products Example.py +524 -0
- examples/Jupyter Notebooks/P-egeria-server-config.ipynb +2137 -0
- examples/Jupyter Notebooks/README.md +2 -0
- examples/Jupyter Notebooks/common/P-environment-check.ipynb +115 -0
- examples/Jupyter Notebooks/common/__init__.py +14 -0
- examples/Jupyter Notebooks/common/common-functions.ipynb +4694 -0
- examples/Jupyter Notebooks/common/environment-check.ipynb +52 -0
- examples/Jupyter Notebooks/common/globals.ipynb +184 -0
- examples/Jupyter Notebooks/common/globals.py +154 -0
- examples/Jupyter Notebooks/common/orig_globals.py +152 -0
- examples/format_sets/all_format_sets.json +910 -0
- examples/format_sets/custom_format_sets.json +268 -0
- examples/format_sets/subset_format_sets.json +187 -0
- examples/format_sets_save_load_example.py +291 -0
- examples/jacquard_data_sets.py +129 -0
- examples/output_formats_example.py +193 -0
- examples/test_jacquard_data_sets.py +54 -0
- examples/test_jacquard_data_sets_scenarios.py +94 -0
- md_processing/__init__.py +33 -24
- md_processing/command_dispatcher.py +33 -0
- md_processing/command_mapping.py +221 -0
- md_processing/data/commands/commands_data_designer.json +537 -0
- md_processing/data/commands/commands_external_reference.json +733 -0
- md_processing/data/commands/commands_feedback.json +155 -0
- md_processing/data/commands/commands_general.json +204 -0
- md_processing/data/commands/commands_glossary.json +218 -0
- md_processing/data/commands/commands_governance.json +3678 -0
- md_processing/data/commands/commands_product_manager.json +865 -0
- md_processing/data/commands/commands_project.json +642 -0
- md_processing/data/commands/commands_solution_architect.json +366 -0
- md_processing/data/commands.json +6489 -30060
- md_processing/data/{commands-working.json → commands_working.json} +9304 -13513
- md_processing/data/gened_report_specs.py +6584 -0
- md_processing/data/generated_format_sets.json +6533 -0
- md_processing/data/generated_format_sets_old.json +4137 -0
- md_processing/data/generated_format_sets_old.py +45 -0
- md_processing/dr_egeria.py +182 -0
- md_processing/md_commands/data_designer_commands.py +195 -583
- md_processing/md_commands/ext_ref_commands.py +530 -0
- md_processing/md_commands/feedback_commands.py +726 -0
- md_processing/md_commands/glossary_commands.py +106 -490
- md_processing/md_commands/governance_officer_commands.py +129 -18
- md_processing/md_commands/product_manager_commands.py +362 -115
- md_processing/md_commands/project_commands.py +351 -134
- md_processing/md_commands/solution_architect_commands.py +276 -232
- md_processing/md_commands/view_commands.py +295 -0
- md_processing/md_processing_utils/common_md_proc_utils.py +258 -166
- md_processing/md_processing_utils/common_md_utils.py +138 -43
- md_processing/md_processing_utils/determine_width.py +103 -0
- md_processing/md_processing_utils/extraction_utils.py +100 -39
- md_processing/md_processing_utils/gen_report_specs.py +643 -0
- md_processing/md_processing_utils/generate_dr_help.py +61 -33
- md_processing/md_processing_utils/generate_md_cmd_templates.py +20 -19
- md_processing/md_processing_utils/generate_md_templates.py +3 -12
- md_processing/md_processing_utils/md_processing_constants.py +1053 -72
- pyegeria/__init__.py +203 -158
- pyegeria/core/__init__.py +40 -0
- pyegeria/core/_base_platform_client.py +574 -0
- pyegeria/core/_base_server_client.py +573 -0
- pyegeria/{_exceptions_new.py → core/_exceptions.py} +62 -30
- pyegeria/{_globals.py → core/_globals.py} +14 -3
- pyegeria/core/_server_client.py +6073 -0
- pyegeria/{_validators.py → core/_validators.py} +7 -8
- pyegeria/core/config.py +654 -0
- pyegeria/{create_tech_guid_lists.py → core/create_tech_guid_lists.py} +0 -1
- pyegeria/core/load_config.py +37 -0
- pyegeria/{logging_configuration.py → core/logging_configuration.py} +1 -1
- pyegeria/core/mcp_adapter.py +144 -0
- pyegeria/core/mcp_server.py +212 -0
- pyegeria/core/utils.py +405 -0
- pyegeria/{_client.py → deprecated/_client.py} +24 -25
- pyegeria/{_deprecated_gov_engine.py → deprecated/_deprecated_gov_engine.py} +16 -16
- pyegeria/{classification_manager_omvs.py → deprecated/classification_manager_omvs.py} +1987 -1877
- pyegeria/{output_formatter.py → deprecated/output_formatter_with_machine_keys.py} +298 -45
- pyegeria/{runtime_manager_omvs.py → deprecated/runtime_manager_omvs.py} +155 -171
- pyegeria/{valid_metadata_omvs.py → deprecated/valid_metadata_omvs.py} +93 -93
- pyegeria/{x_action_author_omvs.py → deprecated/x_action_author_omvs.py} +2 -3
- pyegeria/egeria_cat_client.py +26 -70
- pyegeria/egeria_client.py +130 -93
- pyegeria/egeria_config_client.py +40 -46
- pyegeria/egeria_tech_client.py +141 -54
- pyegeria/models/__init__.py +150 -0
- pyegeria/{models.py → models/models.py} +156 -20
- pyegeria/omvs/__init__.py +84 -0
- pyegeria/omvs/action_author.py +342 -0
- pyegeria/omvs/actor_manager.py +5980 -0
- pyegeria/omvs/asset_catalog.py +842 -0
- pyegeria/omvs/asset_maker.py +2736 -0
- pyegeria/omvs/automated_curation.py +4403 -0
- pyegeria/omvs/classification_manager.py +11213 -0
- pyegeria/{collection_manager.py → omvs/collection_manager.py} +1334 -1160
- pyegeria/omvs/community_matters_omvs.py +468 -0
- pyegeria/{core_omag_server_config.py → omvs/core_omag_server_config.py} +157 -157
- pyegeria/{data_designer.py → omvs/data_designer.py} +1115 -660
- pyegeria/omvs/data_discovery.py +869 -0
- pyegeria/omvs/data_engineer.py +372 -0
- pyegeria/omvs/digital_business.py +1133 -0
- pyegeria/omvs/external_links.py +1752 -0
- pyegeria/omvs/feedback_manager.py +834 -0
- pyegeria/{full_omag_server_config.py → omvs/full_omag_server_config.py} +73 -69
- pyegeria/{glossary_manager.py → omvs/glossary_manager.py} +857 -519
- pyegeria/{governance_officer.py → omvs/governance_officer.py} +964 -468
- pyegeria/omvs/lineage_linker.py +314 -0
- pyegeria/omvs/location_arena.py +1525 -0
- pyegeria/omvs/metadata_expert.py +668 -0
- pyegeria/omvs/metadata_explorer_omvs.py +2943 -0
- pyegeria/omvs/my_profile.py +1042 -0
- pyegeria/omvs/notification_manager.py +358 -0
- pyegeria/omvs/people_organizer.py +394 -0
- pyegeria/{platform_services.py → omvs/platform_services.py} +113 -193
- pyegeria/omvs/product_manager.py +1825 -0
- pyegeria/omvs/project_manager.py +1907 -0
- pyegeria/omvs/reference_data.py +1140 -0
- pyegeria/omvs/registered_info.py +334 -0
- pyegeria/omvs/runtime_manager.py +2817 -0
- pyegeria/omvs/schema_maker.py +446 -0
- pyegeria/{server_operations.py → omvs/server_operations.py} +27 -26
- pyegeria/{solution_architect_omvs.py → omvs/solution_architect.py} +1886 -1505
- pyegeria/omvs/specification_properties.py +37 -0
- pyegeria/omvs/subject_area.py +1042 -0
- pyegeria/omvs/template_manager_omvs.py +236 -0
- pyegeria/omvs/time_keeper.py +1761 -0
- pyegeria/omvs/valid_metadata.py +3221 -0
- pyegeria/omvs/valid_metadata_lists.py +37 -0
- pyegeria/omvs/valid_type_lists.py +37 -0
- pyegeria/view/__init__.py +28 -0
- pyegeria/{_output_format_models.py → view/_output_format_models.py} +160 -24
- pyegeria/view/_output_formats.py +14 -0
- pyegeria/view/base_report_formats.py +2719 -0
- pyegeria/view/dr_egeria_reports.py +56 -0
- pyegeria/view/format_set_executor.py +397 -0
- pyegeria/{md_processing_utils.py → view/md_processing_utils.py} +5 -5
- pyegeria/{mermaid_utilities.py → view/mermaid_utilities.py} +2 -154
- pyegeria/view/output_formatter.py +1297 -0
- pyegeria-5.5.3.3.dist-info/METADATA +218 -0
- pyegeria-5.5.3.3.dist-info/RECORD +241 -0
- {pyegeria-5.4.0.28.dist-info → pyegeria-5.5.3.3.dist-info}/WHEEL +2 -1
- pyegeria-5.5.3.3.dist-info/entry_points.txt +103 -0
- pyegeria-5.5.3.3.dist-info/top_level.txt +4 -0
- commands/cat/.DS_Store +0 -0
- commands/cat/.env +0 -8
- commands/cat/README.md +0 -16
- commands/cat/debug_log +0 -1126
- commands/cat/debug_log.2025-08-18_11-34-38_088636.zip +0 -0
- commands/cat/list_categories.py +0 -192
- commands/cat/logs/pyegeria.log +0 -4
- commands/cli/debug_log +0 -0
- commands/cli/debug_log.log +0 -0
- commands/cli/txt_custom_v2.tcss +0 -19
- commands/my/README.md +0 -17
- commands/ops/README.md +0 -24
- commands/ops/logs/pyegeria.log +0 -0
- commands/ops/monitor_asset_events.py +0 -108
- commands/tech/README.md +0 -24
- md_processing/.DS_Store +0 -0
- md_processing/dr-egeria-outbox/Collections-2025-08-12-13-30-37.md +0 -163
- md_processing/dr-egeria-outbox/Collections-2025-08-12-13-35-58.md +0 -474
- md_processing/dr_egeria_inbox/Derive-Dr-Gov-Defs.md +0 -8
- md_processing/dr_egeria_inbox/Dr.Egeria Templates.md +0 -873
- md_processing/dr_egeria_inbox/arch_test.md +0 -57
- md_processing/dr_egeria_inbox/archive/dr_egeria_intro.md +0 -254
- md_processing/dr_egeria_inbox/archive/dr_egeria_intro_more_terms.md +0 -696
- md_processing/dr_egeria_inbox/archive/dr_egeria_intro_part1.md +0 -254
- md_processing/dr_egeria_inbox/archive/dr_egeria_intro_part2.md +0 -298
- md_processing/dr_egeria_inbox/archive/dr_egeria_intro_part3.md +0 -608
- md_processing/dr_egeria_inbox/archive/dr_egeria_intro_part4.md +0 -94
- md_processing/dr_egeria_inbox/archive/freddie_intro.md +0 -284
- md_processing/dr_egeria_inbox/archive/freddie_intro_orig.md +0 -275
- md_processing/dr_egeria_inbox/archive/test-term.md +0 -110
- md_processing/dr_egeria_inbox/cat_test.md +0 -100
- md_processing/dr_egeria_inbox/collections.md +0 -39
- md_processing/dr_egeria_inbox/data_designer_debug.log +0 -6
- md_processing/dr_egeria_inbox/data_designer_out.md +0 -60
- md_processing/dr_egeria_inbox/data_designer_search_test.md +0 -11
- md_processing/dr_egeria_inbox/data_field.md +0 -54
- md_processing/dr_egeria_inbox/data_spec.md +0 -77
- md_processing/dr_egeria_inbox/data_spec_test.md +0 -2406
- md_processing/dr_egeria_inbox/data_test.md +0 -179
- md_processing/dr_egeria_inbox/data_test2.md +0 -429
- md_processing/dr_egeria_inbox/data_test3.md +0 -462
- md_processing/dr_egeria_inbox/dr_egeria_data_designer_1.md +0 -124
- md_processing/dr_egeria_inbox/dr_egeria_intro_categories.md +0 -168
- md_processing/dr_egeria_inbox/dr_egeria_intro_part1.md +0 -280
- md_processing/dr_egeria_inbox/dr_egeria_intro_part2.md +0 -318
- md_processing/dr_egeria_inbox/dr_egeria_intro_part3.md +0 -1073
- md_processing/dr_egeria_inbox/dr_egeria_isc1.md +0 -44
- md_processing/dr_egeria_inbox/generated_help_report.md +0 -9
- md_processing/dr_egeria_inbox/glossary_creation_experiment.ipynb +0 -341
- md_processing/dr_egeria_inbox/glossary_list.md +0 -5
- md_processing/dr_egeria_inbox/glossary_search_test.md +0 -40
- md_processing/dr_egeria_inbox/glossary_test1.md +0 -324
- md_processing/dr_egeria_inbox/gov_def.md +0 -482
- md_processing/dr_egeria_inbox/gov_def2.md +0 -447
- md_processing/dr_egeria_inbox/img.png +0 -0
- md_processing/dr_egeria_inbox/product.md +0 -211
- md_processing/dr_egeria_inbox/rel.md +0 -8
- md_processing/dr_egeria_inbox/sb.md +0 -119
- md_processing/dr_egeria_inbox/solution-components.md +0 -136
- md_processing/dr_egeria_inbox/solution_blueprints.md +0 -118
- md_processing/dr_egeria_inbox/synonym_test.md +0 -42
- md_processing/dr_egeria_inbox/t2.md +0 -268
- md_processing/dr_egeria_outbox/.obsidian/app.json +0 -1
- md_processing/dr_egeria_outbox/.obsidian/appearance.json +0 -1
- md_processing/dr_egeria_outbox/.obsidian/community-plugins.json +0 -6
- md_processing/dr_egeria_outbox/.obsidian/core-plugins.json +0 -31
- md_processing/dr_egeria_outbox/.obsidian/plugins/calendar/data.json +0 -10
- md_processing/dr_egeria_outbox/.obsidian/plugins/calendar/main.js +0 -4459
- md_processing/dr_egeria_outbox/.obsidian/plugins/calendar/manifest.json +0 -10
- md_processing/dr_egeria_outbox/.obsidian/plugins/obsidian-kanban/data.json +0 -3
- md_processing/dr_egeria_outbox/.obsidian/plugins/obsidian-kanban/main.js +0 -153
- md_processing/dr_egeria_outbox/.obsidian/plugins/obsidian-kanban/manifest.json +0 -11
- md_processing/dr_egeria_outbox/.obsidian/plugins/obsidian-kanban/styles.css +0 -1
- md_processing/dr_egeria_outbox/.obsidian/plugins/obsidian-tasks-plugin/main.js +0 -500
- md_processing/dr_egeria_outbox/.obsidian/plugins/obsidian-tasks-plugin/manifest.json +0 -12
- md_processing/dr_egeria_outbox/.obsidian/plugins/obsidian-tasks-plugin/styles.css +0 -1
- md_processing/dr_egeria_outbox/.obsidian/plugins/templater-obsidian/main.js +0 -37
- md_processing/dr_egeria_outbox/.obsidian/plugins/templater-obsidian/manifest.json +0 -11
- md_processing/dr_egeria_outbox/.obsidian/plugins/templater-obsidian/styles.css +0 -220
- md_processing/dr_egeria_outbox/.obsidian/types.json +0 -28
- md_processing/dr_egeria_outbox/.obsidian/workspace.json +0 -220
- md_processing/dr_egeria_outbox/Untitled.canvas +0 -1
- md_processing/dr_egeria_outbox/friday/processed-2025-08-22 21:22-dr_egeria_intro_part1.md +0 -312
- md_processing/dr_egeria_outbox/friday/processed-2025-08-22 21:23-dr_egeria_intro_part1.md +0 -265
- md_processing/dr_egeria_outbox/friday/processed-2025-08-23 15:06-dr_egeria_intro_part1.md +0 -230
- md_processing/dr_egeria_outbox/friday/processed-2025-08-23 15:30-dr_egeria_intro_part1.md +0 -296
- md_processing/dr_egeria_outbox/friday/processed-2025-08-23 15:31-dr_egeria_intro_part1.md +0 -253
- md_processing/dr_egeria_outbox/friday/processed-2025-08-23 16:08-dr_egeria_intro_part2.md +0 -343
- md_processing/dr_egeria_outbox/friday/processed-2025-08-23 16:12-dr_egeria_intro_part2.md +0 -343
- md_processing/dr_egeria_outbox/monday/processed-2025-08-19 07:05-product.md +0 -426
- md_processing/dr_egeria_outbox/monday/processed-2025-08-19 07:56-product.md +0 -212
- md_processing/dr_egeria_outbox/monday/processed-2025-08-19 09:43-product.md +0 -201
- md_processing/dr_egeria_outbox/sunday/processed-2025-07-20 14:55-product.md +0 -77
- md_processing/dr_egeria_outbox/sunday/processed-2025-07-20 15:05-product.md +0 -75
- md_processing/dr_egeria_outbox/sunday/processed-2025-07-20 15:11-product.md +0 -74
- md_processing/dr_egeria_outbox/sunday/processed-2025-07-20 20:40-collections.md +0 -49
- md_processing/dr_egeria_outbox/thursday/processed-2025-07-17 15:00-Derive-Dr-Gov-Defs.md +0 -719
- md_processing/dr_egeria_outbox/thursday/processed-2025-07-17 20:13-Derive-Dr-Gov-Defs.md +0 -41
- md_processing/dr_egeria_outbox/thursday/processed-2025-07-17 20:14-Derive-Dr-Gov-Defs.md +0 -33
- md_processing/dr_egeria_outbox/thursday/processed-2025-07-17 20:50-Derive-Dr-Gov-Defs.md +0 -192
- md_processing/dr_egeria_outbox/thursday/processed-2025-07-17 22:08-gov_def2.md +0 -486
- md_processing/dr_egeria_outbox/thursday/processed-2025-07-17 22:10-gov_def2.md +0 -486
- md_processing/dr_egeria_outbox/thursday/processed-2025-07-18 08:53-gov_def2.md +0 -486
- md_processing/dr_egeria_outbox/thursday/processed-2025-07-18 08:54-gov_def2.md +0 -486
- md_processing/dr_egeria_outbox/thursday/processed-2025-07-18 09:03-gov_def2.md +0 -486
- md_processing/dr_egeria_outbox/thursday/processed-2025-07-18 09:06-gov_def2.md +0 -486
- md_processing/dr_egeria_outbox/thursday/processed-2025-07-18 09:10-gov_def2.md +0 -486
- md_processing/dr_egeria_outbox/tuesday/processed-2025-07-16 19:15-gov_def2.md +0 -527
- md_processing/dr_egeria_outbox/tuesday/processed-2025-07-17 12:08-gov_def2.md +0 -527
- md_processing/dr_egeria_outbox/tuesday/processed-2025-07-17 14:27-gov_def2.md +0 -485
- md_processing/dr_egeria_outbox/tuesday/processed-2025-08-19 10:55-product.md +0 -209
- md_processing/family_docs/Data Designer/Create_Data_Class.md +0 -164
- md_processing/family_docs/Data Designer/Create_Data_Dictionary.md +0 -30
- md_processing/family_docs/Data Designer/Create_Data_Field.md +0 -162
- md_processing/family_docs/Data Designer/Create_Data_Specification.md +0 -36
- md_processing/family_docs/Data Designer/Create_Data_Structure.md +0 -38
- md_processing/family_docs/Data Designer/View_Data_Classes.md +0 -78
- md_processing/family_docs/Data Designer/View_Data_Dictionaries.md +0 -78
- md_processing/family_docs/Data Designer/View_Data_Fields.md +0 -78
- md_processing/family_docs/Data Designer/View_Data_Specifications.md +0 -78
- md_processing/family_docs/Data Designer/View_Data_Structures.md +0 -78
- md_processing/family_docs/Data Designer.md +0 -842
- md_processing/family_docs/Digital Product Manager/Add_Member->Collection.md +0 -42
- md_processing/family_docs/Digital Product Manager/Attach_Collection->Resource.md +0 -36
- md_processing/family_docs/Digital Product Manager/Create_Agreement.md +0 -96
- md_processing/family_docs/Digital Product Manager/Create_Data_Sharing_Agreement.md +0 -72
- md_processing/family_docs/Digital Product Manager/Create_DigitalSubscription.md +0 -102
- md_processing/family_docs/Digital Product Manager/Create_Digital_Product.md +0 -134
- md_processing/family_docs/Digital Product Manager/Link_Agreement_Items.md +0 -60
- md_processing/family_docs/Digital Product Manager/Link_Contracts.md +0 -26
- md_processing/family_docs/Digital Product Manager/Link_Digital_Product_-_Digital_Product.md +0 -30
- md_processing/family_docs/Digital Product Manager/Link_Subscribers.md +0 -48
- md_processing/family_docs/Digital Product Manager.md +0 -668
- md_processing/family_docs/Glossary/Attach_Category_Parent.md +0 -18
- md_processing/family_docs/Glossary/Attach_Term-Term_Relationship.md +0 -26
- md_processing/family_docs/Glossary/Create_Category.md +0 -38
- md_processing/family_docs/Glossary/Create_Glossary.md +0 -42
- md_processing/family_docs/Glossary/Create_Term.md +0 -70
- md_processing/family_docs/Glossary.md +0 -206
- md_processing/family_docs/Governance Officer/Create_Business_Imperative.md +0 -106
- md_processing/family_docs/Governance Officer/Create_Certification_Type.md +0 -112
- md_processing/family_docs/Governance Officer/Create_Governance_Approach.md +0 -114
- md_processing/family_docs/Governance Officer/Create_Governance_Obligation.md +0 -114
- md_processing/family_docs/Governance Officer/Create_Governance_Principle.md +0 -114
- md_processing/family_docs/Governance Officer/Create_Governance_Procedure.md +0 -128
- md_processing/family_docs/Governance Officer/Create_Governance_Process.md +0 -122
- md_processing/family_docs/Governance Officer/Create_Governance_Processing_Purpose.md +0 -106
- md_processing/family_docs/Governance Officer/Create_Governance_Responsibility.md +0 -122
- md_processing/family_docs/Governance Officer/Create_Governance_Rule.md +0 -122
- md_processing/family_docs/Governance Officer/Create_Governance_Strategy.md +0 -106
- md_processing/family_docs/Governance Officer/Create_License_Type.md +0 -112
- md_processing/family_docs/Governance Officer/Create_Naming_Standard_Rule.md +0 -122
- md_processing/family_docs/Governance Officer/Create_Regulation_Article.md +0 -106
- md_processing/family_docs/Governance Officer/Create_Regulation_Definition.md +0 -118
- md_processing/family_docs/Governance Officer/Create_Security_Access_Control.md +0 -114
- md_processing/family_docs/Governance Officer/Create_Security_Group.md +0 -120
- md_processing/family_docs/Governance Officer/Create_Service_Level_Objectives.md +0 -122
- md_processing/family_docs/Governance Officer/Create_Threat_Definition.md +0 -106
- md_processing/family_docs/Governance Officer/Link_Governance_Controls.md +0 -32
- md_processing/family_docs/Governance Officer/Link_Governance_Drivers.md +0 -32
- md_processing/family_docs/Governance Officer/Link_Governance_Policies.md +0 -32
- md_processing/family_docs/Governance Officer/View_Governance_Definitions.md +0 -82
- md_processing/family_docs/Governance Officer.md +0 -2412
- md_processing/family_docs/Solution Architect/Create_Information_Supply_Chain.md +0 -70
- md_processing/family_docs/Solution Architect/Create_Solution_Blueprint.md +0 -44
- md_processing/family_docs/Solution Architect/Create_Solution_Component.md +0 -96
- md_processing/family_docs/Solution Architect/Create_Solution_Role.md +0 -66
- md_processing/family_docs/Solution Architect/Link_Information_Supply_Chain_Peers.md +0 -32
- md_processing/family_docs/Solution Architect/Link_Solution_Component_Peers.md +0 -32
- md_processing/family_docs/Solution Architect/View_Information_Supply_Chains.md +0 -32
- md_processing/family_docs/Solution Architect/View_Solution_Blueprints.md +0 -32
- md_processing/family_docs/Solution Architect/View_Solution_Components.md +0 -32
- md_processing/family_docs/Solution Architect/View_Solution_Roles.md +0 -32
- md_processing/family_docs/Solution Architect.md +0 -490
- md_processing/md_processing_utils/debug_log +0 -574
- md_processing/md_processing_utils/debug_log.log +0 -0
- md_processing/md_processing_utils/dr-egeria-help-2025-07-17T17:22:09.md +0 -2065
- md_processing/md_processing_utils/generated_help_terms.md +0 -842
- pyegeria/.DS_Store +0 -0
- pyegeria/README.md +0 -35
- pyegeria/_client_new.py +0 -1102
- pyegeria/_output_formats.py +0 -730
- pyegeria/asset_catalog_omvs.py +0 -864
- pyegeria/automated_curation_omvs.py +0 -3765
- pyegeria/config.py +0 -523
- pyegeria/egeria_my_client.py +0 -91
- pyegeria/feedback_manager_omvs.py +0 -4573
- pyegeria/load_config_orig.py +0 -218
- pyegeria/md_processing_helpers.py +0 -58
- pyegeria/md_processing_utils_orig.py +0 -1103
- pyegeria/metadata_explorer_omvs.py +0 -2326
- pyegeria/my_profile_omvs.py +0 -1022
- pyegeria/project_manager.py +0 -1591
- pyegeria/registered_info.py +0 -167
- pyegeria/template_manager_omvs.py +0 -1414
- pyegeria/utils.py +0 -256
- pyegeria-5.4.0.28.dist-info/METADATA +0 -77
- pyegeria-5.4.0.28.dist-info/RECORD +0 -343
- pyegeria-5.4.0.28.dist-info/entry_points.txt +0 -105
- /commands/cat/debug_log.log → /pyegeria/deprecated/__init__.py +0 -0
- /pyegeria/{_exceptions.py → deprecated/_exceptions.py} +0 -0
- /pyegeria/{collection_models.py → models/collection_models.py} +0 -0
- {pyegeria-5.4.0.28.dist-info → pyegeria-5.5.3.3.dist-info/licenses}/LICENSE +0 -0
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Compatibility shim for legacy imports.
|
|
3
|
+
Re-exports configuration loading utilities from pyegeria.config.
|
|
4
|
+
"""
|
|
5
|
+
# Import config lazily inside functions to avoid import-time side effects in tests
|
|
6
|
+
from importlib import import_module
|
|
7
|
+
|
|
8
|
+
def load_app_config(env_file: str | None = None):
|
|
9
|
+
return import_module('pyegeria.config').load_app_config(env_file)
|
|
10
|
+
|
|
11
|
+
def get_app_config(env_file: str | None = None):
|
|
12
|
+
return import_module('pyegeria.config').get_app_config(env_file)
|
|
13
|
+
|
|
14
|
+
class PyegeriaSettings:
|
|
15
|
+
def __new__(cls, *args, **kwargs):
|
|
16
|
+
# Construct a real settings instance from pyegeria.config
|
|
17
|
+
return import_module('pyegeria.config').PyegeriaSettings(*args, **kwargs)
|
|
18
|
+
|
|
19
|
+
@classmethod
|
|
20
|
+
def with_env_file(cls, env_file: str):
|
|
21
|
+
return import_module('pyegeria.config').PyegeriaSettings.with_env_file(env_file)
|
|
22
|
+
|
|
23
|
+
# expose the cached instance for tests that reset it directly
|
|
24
|
+
from pyegeria.core import config as _config
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def __getattr__(name):
|
|
28
|
+
if name == "_app_config":
|
|
29
|
+
return _config._app_config
|
|
30
|
+
raise AttributeError(name)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def __setattr__(name, value):
|
|
34
|
+
if name == "_app_config":
|
|
35
|
+
_config._app_config = value
|
|
36
|
+
else:
|
|
37
|
+
globals()[name] = value
|
|
@@ -131,7 +131,7 @@ To suppress logging, an application can do the following:
|
|
|
131
131
|
# application.py (Scenario A: App uses Loguru)
|
|
132
132
|
import os, sys
|
|
133
133
|
from loguru import logger
|
|
134
|
-
from pyegeria.config import settings as app_settings
|
|
134
|
+
from pyegeria.core.config import settings as app_settings
|
|
135
135
|
|
|
136
136
|
def console_log_filter(record):
|
|
137
137
|
if len(record["module"]) > 0:
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
"""
|
|
2
|
+
SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
Thin adapter helpers to surface pyegeria FormatSets as MCP-style tools without
|
|
5
|
+
side effects. This does NOT implement an MCP transport/server; it focuses on
|
|
6
|
+
programmatic functions that an MCP server entry point can call.
|
|
7
|
+
|
|
8
|
+
Only format sets that advertise DICT or ALL are considered eligible.
|
|
9
|
+
"""
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
import json
|
|
13
|
+
import sys
|
|
14
|
+
from typing import Any, Dict, Optional
|
|
15
|
+
|
|
16
|
+
from loguru import logger
|
|
17
|
+
|
|
18
|
+
from pyegeria.view.base_report_formats import (
|
|
19
|
+
list_mcp_format_sets,
|
|
20
|
+
select_report_spec, find_report_specs,
|
|
21
|
+
)
|
|
22
|
+
from pyegeria.egeria_tech_client import EgeriaTech
|
|
23
|
+
from pyegeria.view.format_set_executor import exec_report_spec, _async_run_report
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def list_reports() -> dict:
|
|
27
|
+
"""List eligible format sets as MCP tools (support DICT or ALL)."""
|
|
28
|
+
return list_mcp_format_sets()
|
|
29
|
+
|
|
30
|
+
def run_find_report_specs(perspective: str= None, question: str= None, report_spec:str= None) -> Dict[str, Any]:
|
|
31
|
+
"""
|
|
32
|
+
Find report specs that match the given perspective and question.
|
|
33
|
+
|
|
34
|
+
Args:
|
|
35
|
+
perspective (str): The perspective to search for (e.g., "Data Steward").
|
|
36
|
+
question (str): The question to search for (e.g., "What is the current status of the project?").
|
|
37
|
+
report_spec (str): The report spec to search for (e.g., "ProjectStatusReport").
|
|
38
|
+
|
|
39
|
+
Returns:
|
|
40
|
+
list[dict]: A list of dictionaries, each representing a matching report spec item.
|
|
41
|
+
"""
|
|
42
|
+
perspective = None if perspective == "*" else perspective
|
|
43
|
+
question = None if question == "*" else question
|
|
44
|
+
report_spec = None if report_spec == "*" else report_spec
|
|
45
|
+
|
|
46
|
+
report_specs = find_report_specs(perspective=perspective, question=question, report_spec=report_spec)
|
|
47
|
+
if not report_specs:
|
|
48
|
+
raise ValueError(f"No report specs found for perspective '{perspective}' and question '{question}'")
|
|
49
|
+
return {"Matching Report Specs" : report_specs}
|
|
50
|
+
|
|
51
|
+
def describe_report(name: str, output_type: str = "DICT") -> Dict[str, Any]:
|
|
52
|
+
"""
|
|
53
|
+
Describe a format set for MCP discovery. If outputType != ANY, a concrete format
|
|
54
|
+
will be resolved; otherwise only metadata/action are returned.
|
|
55
|
+
"""
|
|
56
|
+
meta = select_report_spec(name, output_type)
|
|
57
|
+
if not meta:
|
|
58
|
+
raise ValueError(f"Unknown or incompatible format set: {name}")
|
|
59
|
+
return meta
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def _execute_egeria_call_blocking(
|
|
63
|
+
*,
|
|
64
|
+
report: str,
|
|
65
|
+
params: Optional[Dict[str, Any]] = None,
|
|
66
|
+
view_server: Optional[str] = None,
|
|
67
|
+
view_url: Optional[str] = None,
|
|
68
|
+
user: Optional[str] = None,
|
|
69
|
+
user_pass: Optional[str] = None,) -> Dict[str, Any]:
|
|
70
|
+
"""
|
|
71
|
+
Executes the synchronous, blocking Egeria client call on a dedicated worker thread.
|
|
72
|
+
|
|
73
|
+
You must replace the hardcoded return with your actual Egeria client logic here.
|
|
74
|
+
All code in this function runs in a blocking, synchronous manner.
|
|
75
|
+
"""
|
|
76
|
+
|
|
77
|
+
print(
|
|
78
|
+
f"Format set: {report}\nparams: {json.dumps(params)}\nview_server: {view_server}\nview_url: {view_url}\nuser: {user}\nuser_pass: {user_pass}",
|
|
79
|
+
file=sys.stderr)
|
|
80
|
+
# Lazy import of settings to avoid circulars when optional args are None
|
|
81
|
+
# from pyegeria.config import settings as _settings
|
|
82
|
+
from pyegeria.core.config import settings as _settings
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
return exec_report_spec(
|
|
86
|
+
format_set_name=report,
|
|
87
|
+
output_format="DICT",
|
|
88
|
+
params=params or {},
|
|
89
|
+
view_server=view_server if view_server is not None else _settings.Environment.egeria_view_server,
|
|
90
|
+
view_url=view_url if view_url is not None else _settings.Environment.egeria_view_server_url,
|
|
91
|
+
user=user if user is not None else _settings.User_Profile.user_name,
|
|
92
|
+
user_pass=user_pass if user_pass is not None else _settings.User_Profile.user_pwd,
|
|
93
|
+
)
|
|
94
|
+
# # Returning the hardcoded success for now to prove the async structure works.
|
|
95
|
+
# return {
|
|
96
|
+
# "status": "SUCCESS (Thread Test)",
|
|
97
|
+
# "report_name": report_name,
|
|
98
|
+
# "message": "The blocking call was successfully run on a separate thread, preventing timeout."
|
|
99
|
+
# }
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
def run_report(
|
|
104
|
+
*,
|
|
105
|
+
report: str,
|
|
106
|
+
params: Optional[Dict[str, Any]] = None,
|
|
107
|
+
view_server: Optional[str] = None,
|
|
108
|
+
view_url: Optional[str] = None,
|
|
109
|
+
user: Optional[str] = None,
|
|
110
|
+
user_pass: Optional[str] = None,
|
|
111
|
+
) -> Dict[str, Any]:
|
|
112
|
+
"""
|
|
113
|
+
Execute a format set action as an MCP-style tool. Enforces DICT/ALL by default.
|
|
114
|
+
Caller may pass credentials explicitly; otherwise defaults are used from config.
|
|
115
|
+
"""
|
|
116
|
+
print(f"Format set: {report}\nparams: {json.dumps(params)}\nview_server: {view_server}\nview_url: {view_url}\nuser: {user}\nuser_pass: {user_pass}", file=sys.stderr)
|
|
117
|
+
# Lazy import of settings to avoid circulars when optional args are None
|
|
118
|
+
from pyegeria.core.config import settings as _settings
|
|
119
|
+
logger.info(f"Format set: {report}\nparams: {json.dumps(params)}\nview_server: {view_server}\nview_url: {view_url}\nuser: {user}\nuser_pass: {user_pass}")
|
|
120
|
+
return exec_report_spec(
|
|
121
|
+
format_set_name=report,
|
|
122
|
+
output_format="DICT",
|
|
123
|
+
params=params or {},
|
|
124
|
+
view_server=view_server if view_server is not None else _settings.Environment.egeria_view_server,
|
|
125
|
+
view_url=view_url if view_url is not None else _settings.Environment.egeria_view_server_url,
|
|
126
|
+
user=user if user is not None else _settings.User_Profile.user_name,
|
|
127
|
+
user_pass=user_pass if user_pass is not None else _settings.User_Profile.user_pwd,
|
|
128
|
+
)
|
|
129
|
+
|
|
130
|
+
async def _async_run_report_tool(
|
|
131
|
+
*,
|
|
132
|
+
report: str,
|
|
133
|
+
egeria_client: EgeriaTech,
|
|
134
|
+
params: Optional[Dict[str, Any]] = None,
|
|
135
|
+
) -> Dict[str, Any]:
|
|
136
|
+
"""
|
|
137
|
+
Execute a format set action as an MCP-style tool. Enforces DICT/ALL by default.
|
|
138
|
+
Caller may pass credentials explicitly; otherwise defaults are used from config.
|
|
139
|
+
"""
|
|
140
|
+
# Lazy import of settings to avoid circulars when optional args are None
|
|
141
|
+
|
|
142
|
+
print(f"Report: {report}\n params: {json.dumps(params)}\n", file=sys.stderr)
|
|
143
|
+
result = await _async_run_report(report, egeria_client, output_format="DICT", params=params)
|
|
144
|
+
return result
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
"""PDX-License-Identifier: Apache-2.0
|
|
2
|
+
Copyright Contributors to the ODPi Egeria project.
|
|
3
|
+
|
|
4
|
+
This module provides a basic MCP server for Egeria.
|
|
5
|
+
"""
|
|
6
|
+
import re
|
|
7
|
+
import sys
|
|
8
|
+
import nest_asyncio
|
|
9
|
+
|
|
10
|
+
from typing import Any, Dict, Optional
|
|
11
|
+
|
|
12
|
+
from mcp.server.fastmcp.exceptions import ValidationError
|
|
13
|
+
|
|
14
|
+
from pyegeria.egeria_tech_client import EgeriaTech
|
|
15
|
+
from pyegeria.core._exceptions import print_validation_error
|
|
16
|
+
# from pyegeria.base_report_formats import find_report_specs
|
|
17
|
+
|
|
18
|
+
GLOBAL_EGERIA_CLIENT: Optional[EgeriaTech] = None
|
|
19
|
+
nest_asyncio.apply()
|
|
20
|
+
|
|
21
|
+
try:
|
|
22
|
+
# We use Optional[] and List[] types, so we import them.
|
|
23
|
+
from mcp.server.fastmcp import FastMCP
|
|
24
|
+
from pyegeria.core.mcp_adapter import (
|
|
25
|
+
list_reports,
|
|
26
|
+
describe_report,
|
|
27
|
+
run_report, _execute_egeria_call_blocking,
|
|
28
|
+
_async_run_report_tool, run_find_report_specs
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
print("MCP import successful...", file=sys.stderr)
|
|
32
|
+
except ImportError:
|
|
33
|
+
print("MCP import failed.", file=sys.stderr)
|
|
34
|
+
raise
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def _ok(result: Dict[str, Any]) -> Dict[str, Any]:
|
|
38
|
+
# Pass-through helper in case you want to normalize or add metadata
|
|
39
|
+
print("OK: Operation completed successfully.", file=sys.stderr)
|
|
40
|
+
return result
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def main() -> None:
|
|
44
|
+
# Initialize the server
|
|
45
|
+
|
|
46
|
+
global GLOBAL_EGERIA_CLIENT
|
|
47
|
+
|
|
48
|
+
try:
|
|
49
|
+
""" Runs ONCE when the server starts.
|
|
50
|
+
Initializes the Egeria client and stores it in the server's state.
|
|
51
|
+
"""
|
|
52
|
+
print("DEBUG: Initializing Egeria client...", file=sys.stderr)
|
|
53
|
+
from pyegeria.core.config import settings as _settings
|
|
54
|
+
user_id = _settings.User_Profile.user_name
|
|
55
|
+
user_pwd = _settings.User_Profile.user_pwd
|
|
56
|
+
|
|
57
|
+
GLOBAL_EGERIA_CLIENT = EgeriaTech(
|
|
58
|
+
_settings.Environment.egeria_view_server,
|
|
59
|
+
_settings.Environment.egeria_view_server_url,
|
|
60
|
+
user_id,
|
|
61
|
+
user_pwd
|
|
62
|
+
)
|
|
63
|
+
print("DEBUG: Egeria Client initialized", file=sys.stderr)
|
|
64
|
+
GLOBAL_EGERIA_CLIENT.create_egeria_bearer_token("erinoverview", "secret")
|
|
65
|
+
print("DEBUG: Egeria Client connected", file=sys.stderr)
|
|
66
|
+
|
|
67
|
+
except ValidationError as e:
|
|
68
|
+
print_validation_error(e)
|
|
69
|
+
raise
|
|
70
|
+
except Exception as e:
|
|
71
|
+
print(f"DEBUG: Exception occurred: {str(e)}", file=sys.stderr)
|
|
72
|
+
raise
|
|
73
|
+
|
|
74
|
+
srv = FastMCP(name="pyegeria-mcp")
|
|
75
|
+
print("Starting MCP server...", file=sys.stderr)
|
|
76
|
+
|
|
77
|
+
# list_reports tool (formerly list_format_sets)
|
|
78
|
+
@srv.tool(name="list_reports")
|
|
79
|
+
def list_reports_tool() -> Dict[str, Any]:
|
|
80
|
+
"""Lists all available reports (FormatSets)."""
|
|
81
|
+
print("DEBUG: Listing reports...", file=sys.stderr)
|
|
82
|
+
return _ok(list_reports())
|
|
83
|
+
|
|
84
|
+
@srv.tool(name="find_report_specs")
|
|
85
|
+
def find_report_specs_tool(perspective: str=None, question: str=None, report_spec: str=None) -> Dict[str, Any]:
|
|
86
|
+
"""Finds report specs that match the given perspective, question, and report spec."""
|
|
87
|
+
print("DEBUG: Finding report specs...", file=sys.stderr)
|
|
88
|
+
return _ok(run_find_report_specs(perspective=perspective, question=question, report_spec=report_spec))
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
@srv.tool(name="describe_report")
|
|
92
|
+
def describe_report_tool(name: str, output_type: str = "DICT") -> Dict[str, Any]:
|
|
93
|
+
"""Returns the schema and details for a specified report."""
|
|
94
|
+
# FastMCP handles validation of 'name' and 'output_type' types automatically.
|
|
95
|
+
print(f"DEBUG: Describing report: {name} with output type: {output_type}", file=sys.stderr)
|
|
96
|
+
try:
|
|
97
|
+
return _ok(describe_report(name, output_type))
|
|
98
|
+
except Exception as e:
|
|
99
|
+
print(f"DEBUG: Exception during describe_report: {str(e)}", file=sys.stderr)
|
|
100
|
+
raise
|
|
101
|
+
|
|
102
|
+
@srv.tool(name="run_report")
|
|
103
|
+
async def run_report_tool(
|
|
104
|
+
report_name: str,
|
|
105
|
+
search_string: str = "*",
|
|
106
|
+
page_size: Optional[int] = 0,
|
|
107
|
+
start_from: Optional[int] = 0,
|
|
108
|
+
starts_with: Optional[bool] = None,
|
|
109
|
+
ends_with: Optional[bool] = None,
|
|
110
|
+
ignore_case: Optional[bool] = None,
|
|
111
|
+
output_format: str = "DICT"
|
|
112
|
+
) -> Dict[str, Any]:
|
|
113
|
+
import asyncio
|
|
114
|
+
import nest_asyncio
|
|
115
|
+
nest_asyncio.apply()
|
|
116
|
+
|
|
117
|
+
"""Run a report with the specified parameters."""
|
|
118
|
+
print("DEBUG: Running report...", file=sys.stderr)
|
|
119
|
+
# 1. Automatic Validation: FastMCP/Pydantic ensures types are correct.
|
|
120
|
+
|
|
121
|
+
# 2. Manual Validation (for specific values like output_format)
|
|
122
|
+
if output_format not in ["DICT", "JSON", "REPORT", "MERMAID", "HTML"]:
|
|
123
|
+
print(f"DEBUG: Invalid output_format: {output_format}", file=sys.stderr)
|
|
124
|
+
raise ValueError(
|
|
125
|
+
f"Invalid output_format: {output_format}. Must be one of ['DICT', 'JSON', 'REPORT', 'MERMAID', 'HTML'].")
|
|
126
|
+
|
|
127
|
+
# 3. Build params dictionary with only non-None values for clean passing
|
|
128
|
+
params = {
|
|
129
|
+
"search_string": search_string,
|
|
130
|
+
"page_size": page_size,
|
|
131
|
+
"start_from": start_from,
|
|
132
|
+
"starts_with": starts_with,
|
|
133
|
+
"ends_with": ends_with,
|
|
134
|
+
"ignore_case": ignore_case,
|
|
135
|
+
}
|
|
136
|
+
# Filter out None values before passing to run_report
|
|
137
|
+
params = {k: v for k, v in params.items() if v is not None}
|
|
138
|
+
|
|
139
|
+
print(f"DEBUG: Running report={report_name} with params={params}", file=sys.stderr)
|
|
140
|
+
|
|
141
|
+
try:
|
|
142
|
+
|
|
143
|
+
egeria_client: EgeriaTech = GLOBAL_EGERIA_CLIENT
|
|
144
|
+
print("DEBUG: Egeria Client connected", file=sys.stderr)
|
|
145
|
+
result = await asyncio.wait_for(
|
|
146
|
+
_async_run_report_tool(
|
|
147
|
+
report=report_name,
|
|
148
|
+
egeria_client=egeria_client,
|
|
149
|
+
params=params),
|
|
150
|
+
timeout=30 # Adjust timeout as needed
|
|
151
|
+
)
|
|
152
|
+
|
|
153
|
+
print("DEBUG: run_report completed successfully", file=sys.stderr)
|
|
154
|
+
return _ok(result)
|
|
155
|
+
except Exception as e:
|
|
156
|
+
# Re-raise the exception to be sent back as a JSON-RPC error
|
|
157
|
+
print(f"DEBUG: Exception occurred: {str(e)}", file=sys.stderr)
|
|
158
|
+
raise
|
|
159
|
+
|
|
160
|
+
@srv.tool(name="prompt")
|
|
161
|
+
async def natural_language_prompt(prompt: str) -> Dict[str, Any]:
|
|
162
|
+
"""
|
|
163
|
+
Handles natural language queries from the user.
|
|
164
|
+
In a production environment, this would call an LLM API.
|
|
165
|
+
"""
|
|
166
|
+
print(f"DEBUG: Received natural language prompt: {prompt}", file=sys.stderr)
|
|
167
|
+
|
|
168
|
+
# Example of simple logic: If the user asks to list reports, delegate to the tool.
|
|
169
|
+
if "list" in prompt.lower() and "reports" in prompt.lower():
|
|
170
|
+
print("DEBUG: Delegating prompt to list_reports tool.", file=sys.stderr)
|
|
171
|
+
return list_reports() # This is sync, so no await needed
|
|
172
|
+
elif "run" in prompt.lower() and "report" in prompt.lower():
|
|
173
|
+
print("DEBUG: Delegating prompt to run_report tool.", file=sys.stderr)
|
|
174
|
+
|
|
175
|
+
match = re.search(r'report\s+([a-zA-Z0-9]+)', prompt, re.IGNORECASE)
|
|
176
|
+
report_name = match.group(1) if match else None
|
|
177
|
+
|
|
178
|
+
if report_name:
|
|
179
|
+
print(f"DEBUG: Extracted report name: {report_name}", file=sys.stderr)
|
|
180
|
+
|
|
181
|
+
page_size_match = re.search(r'page size of\s+(\d+)', prompt, re.IGNORECASE)
|
|
182
|
+
page_size = int(page_size_match.group(1)) if page_size_match else None
|
|
183
|
+
|
|
184
|
+
search_match = re.search(r'search for\s+(.*?)(?:\s+in\s+report|\.|$)', prompt, re.IGNORECASE)
|
|
185
|
+
|
|
186
|
+
if search_match:
|
|
187
|
+
search_string = search_match.group(1).strip()
|
|
188
|
+
|
|
189
|
+
if search_string:
|
|
190
|
+
print(
|
|
191
|
+
f"DEBUG: Delegating prompt to run_report tool. Report: {report_name}, Search: '{search_string}'",
|
|
192
|
+
file=sys.stderr)
|
|
193
|
+
|
|
194
|
+
# AWAIT the async function call
|
|
195
|
+
return await run_report_tool(report_name=report_name, search_string=search_string,
|
|
196
|
+
page_size=page_size)
|
|
197
|
+
|
|
198
|
+
# AWAIT the async function call
|
|
199
|
+
return await run_report_tool(report_name=report_name, page_size=page_size)
|
|
200
|
+
|
|
201
|
+
return {
|
|
202
|
+
"response": f"Acknowledged natural language query: '{prompt}'. This would be sent to an LLM."
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
# CRITICAL: This is the missing step. It tells the server to read and process
|
|
206
|
+
# JSON-RPC messages from standard input (stdin).
|
|
207
|
+
srv.run()
|
|
208
|
+
print("MCP server finished running.", file=sys.stderr)
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
if __name__ == "__main__":
|
|
212
|
+
main()
|