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.

Files changed (433) hide show
  1. commands/__init__.py +24 -0
  2. commands/cat/Dr-Egeria_md-orig.py +2 -2
  3. commands/cat/collection_actions.py +197 -0
  4. commands/cat/dr_egeria_command_help.py +137 -38
  5. commands/cat/dr_egeria_jupyter.py +7 -7
  6. commands/cat/dr_egeria_md.py +10 -267
  7. commands/cat/exp_list_glossaries.py +11 -14
  8. commands/cat/get_asset_graph.py +37 -267
  9. commands/cat/{get_collection.py → get_collection_tree.py} +10 -18
  10. commands/cat/get_project_dependencies.py +14 -14
  11. commands/cat/get_project_structure.py +15 -14
  12. commands/cat/get_tech_type_elements.py +16 -116
  13. commands/cat/glossary_actions.py +145 -298
  14. commands/cat/list_assets.py +3 -11
  15. commands/cat/list_cert_types.py +17 -63
  16. commands/cat/list_collections.py +17 -139
  17. commands/cat/list_deployed_catalogs.py +15 -27
  18. commands/cat/list_deployed_database_schemas.py +27 -43
  19. commands/cat/list_deployed_databases.py +16 -31
  20. commands/cat/list_deployed_servers.py +35 -54
  21. commands/cat/list_glossaries.py +18 -17
  22. commands/cat/list_projects.py +10 -12
  23. commands/cat/list_tech_type_elements.py +21 -37
  24. commands/cat/list_tech_types.py +13 -25
  25. commands/cat/list_terms.py +38 -79
  26. commands/cat/list_todos.py +4 -11
  27. commands/cat/list_user_ids.py +3 -10
  28. commands/cat/my_reports.py +559 -0
  29. commands/cat/run_report.py +394 -0
  30. commands/cat/{list_format_set.py → run_report_orig.py} +136 -44
  31. commands/cli/egeria.py +182 -219
  32. commands/cli/egeria_cat.py +32 -59
  33. commands/cli/egeria_my.py +13 -0
  34. commands/cli/egeria_ops.py +69 -74
  35. commands/cli/egeria_tech.py +17 -93
  36. commands/{cat → deprecated}/list_data_designer.py +2 -4
  37. commands/{cat → deprecated}/list_data_structures_full.py +3 -6
  38. commands/deprecated/old_get_asset_graph.py +315 -0
  39. commands/my/__init__.py +0 -2
  40. commands/my/list_my_profile.py +27 -34
  41. commands/my/list_my_roles.py +1 -7
  42. commands/my/monitor_my_todos.py +1 -7
  43. commands/my/monitor_open_todos.py +6 -7
  44. commands/my/todo_actions.py +4 -5
  45. commands/ops/__init__.py +0 -2
  46. commands/ops/gov_server_actions.py +17 -21
  47. commands/ops/list_archives.py +17 -38
  48. commands/ops/list_catalog_targets.py +33 -40
  49. commands/ops/load_archive.py +14 -11
  50. commands/ops/{monitor_engine_activity_c.py → monitor_active_engine_activity.py} +51 -82
  51. commands/ops/{monitor_integ_daemon_status.py → monitor_daemon_status.py} +35 -55
  52. commands/ops/monitor_engine_activity.py +79 -77
  53. commands/ops/{monitor_gov_eng_status.py → monitor_engine_status.py} +10 -7
  54. commands/ops/monitor_platform_status.py +38 -50
  55. commands/ops/monitor_server_startup.py +6 -11
  56. commands/ops/monitor_server_status.py +7 -11
  57. commands/ops/orig_monitor_server_list.py +8 -8
  58. commands/ops/orig_monitor_server_status.py +1 -5
  59. commands/ops/refresh_integration_daemon.py +5 -5
  60. commands/ops/restart_integration_daemon.py +5 -5
  61. commands/ops/table_integ_daemon_status.py +6 -6
  62. commands/ops/x_engine_actions.py +7 -7
  63. commands/tech/__init__.py +0 -2
  64. commands/tech/{generic_actions.py → element_actions.py} +6 -11
  65. commands/tech/get_element_info.py +20 -29
  66. commands/tech/get_guid_info.py +23 -42
  67. commands/tech/get_tech_details.py +20 -35
  68. commands/tech/get_tech_type_template.py +28 -39
  69. commands/tech/list_all_om_type_elements.py +24 -30
  70. commands/tech/list_all_om_type_elements_x.py +22 -28
  71. commands/tech/list_all_related_elements.py +19 -28
  72. commands/tech/list_anchored_elements.py +22 -30
  73. commands/tech/list_asset_types.py +19 -24
  74. commands/tech/list_elements_by_classification_by_property_value.py +26 -32
  75. commands/tech/list_elements_by_property_value.py +19 -25
  76. commands/tech/list_elements_by_property_value_x.py +20 -28
  77. commands/tech/list_elements_for_classification.py +28 -41
  78. commands/tech/list_gov_action_processes.py +16 -27
  79. commands/tech/list_information_supply_chains.py +22 -30
  80. commands/tech/list_registered_services.py +14 -26
  81. commands/tech/list_related_elements_with_prop_value.py +15 -25
  82. commands/tech/list_related_specification.py +1 -4
  83. commands/tech/list_relationship_types.py +15 -25
  84. commands/tech/list_relationships.py +20 -36
  85. commands/tech/list_solution_blueprints.py +28 -33
  86. commands/tech/list_solution_components.py +23 -29
  87. commands/tech/list_solution_roles.py +21 -32
  88. commands/tech/list_tech_templates.py +51 -54
  89. commands/tech/list_valid_metadata_values.py +5 -9
  90. commands/tech/table_tech_templates.py +2 -6
  91. commands/tech/x_list_related_elements.py +1 -4
  92. examples/GeoSpatial Products Example.py +524 -0
  93. examples/Jupyter Notebooks/P-egeria-server-config.ipynb +2137 -0
  94. examples/Jupyter Notebooks/README.md +2 -0
  95. examples/Jupyter Notebooks/common/P-environment-check.ipynb +115 -0
  96. examples/Jupyter Notebooks/common/__init__.py +14 -0
  97. examples/Jupyter Notebooks/common/common-functions.ipynb +4694 -0
  98. examples/Jupyter Notebooks/common/environment-check.ipynb +52 -0
  99. examples/Jupyter Notebooks/common/globals.ipynb +184 -0
  100. examples/Jupyter Notebooks/common/globals.py +154 -0
  101. examples/Jupyter Notebooks/common/orig_globals.py +152 -0
  102. examples/format_sets/all_format_sets.json +910 -0
  103. examples/format_sets/custom_format_sets.json +268 -0
  104. examples/format_sets/subset_format_sets.json +187 -0
  105. examples/format_sets_save_load_example.py +291 -0
  106. examples/jacquard_data_sets.py +129 -0
  107. examples/output_formats_example.py +193 -0
  108. examples/test_jacquard_data_sets.py +54 -0
  109. examples/test_jacquard_data_sets_scenarios.py +94 -0
  110. md_processing/__init__.py +33 -24
  111. md_processing/command_dispatcher.py +33 -0
  112. md_processing/command_mapping.py +221 -0
  113. md_processing/data/commands/commands_data_designer.json +537 -0
  114. md_processing/data/commands/commands_external_reference.json +733 -0
  115. md_processing/data/commands/commands_feedback.json +155 -0
  116. md_processing/data/commands/commands_general.json +204 -0
  117. md_processing/data/commands/commands_glossary.json +218 -0
  118. md_processing/data/commands/commands_governance.json +3678 -0
  119. md_processing/data/commands/commands_product_manager.json +865 -0
  120. md_processing/data/commands/commands_project.json +642 -0
  121. md_processing/data/commands/commands_solution_architect.json +366 -0
  122. md_processing/data/commands.json +6489 -30060
  123. md_processing/data/{commands-working.json → commands_working.json} +9304 -13513
  124. md_processing/data/gened_report_specs.py +6584 -0
  125. md_processing/data/generated_format_sets.json +6533 -0
  126. md_processing/data/generated_format_sets_old.json +4137 -0
  127. md_processing/data/generated_format_sets_old.py +45 -0
  128. md_processing/dr_egeria.py +182 -0
  129. md_processing/md_commands/data_designer_commands.py +195 -583
  130. md_processing/md_commands/ext_ref_commands.py +530 -0
  131. md_processing/md_commands/feedback_commands.py +726 -0
  132. md_processing/md_commands/glossary_commands.py +106 -490
  133. md_processing/md_commands/governance_officer_commands.py +129 -18
  134. md_processing/md_commands/product_manager_commands.py +362 -115
  135. md_processing/md_commands/project_commands.py +351 -134
  136. md_processing/md_commands/solution_architect_commands.py +276 -232
  137. md_processing/md_commands/view_commands.py +295 -0
  138. md_processing/md_processing_utils/common_md_proc_utils.py +258 -166
  139. md_processing/md_processing_utils/common_md_utils.py +138 -43
  140. md_processing/md_processing_utils/determine_width.py +103 -0
  141. md_processing/md_processing_utils/extraction_utils.py +100 -39
  142. md_processing/md_processing_utils/gen_report_specs.py +643 -0
  143. md_processing/md_processing_utils/generate_dr_help.py +61 -33
  144. md_processing/md_processing_utils/generate_md_cmd_templates.py +20 -19
  145. md_processing/md_processing_utils/generate_md_templates.py +3 -12
  146. md_processing/md_processing_utils/md_processing_constants.py +1053 -72
  147. pyegeria/__init__.py +203 -158
  148. pyegeria/core/__init__.py +40 -0
  149. pyegeria/core/_base_platform_client.py +574 -0
  150. pyegeria/core/_base_server_client.py +573 -0
  151. pyegeria/{_exceptions_new.py → core/_exceptions.py} +62 -30
  152. pyegeria/{_globals.py → core/_globals.py} +14 -3
  153. pyegeria/core/_server_client.py +6073 -0
  154. pyegeria/{_validators.py → core/_validators.py} +7 -8
  155. pyegeria/core/config.py +654 -0
  156. pyegeria/{create_tech_guid_lists.py → core/create_tech_guid_lists.py} +0 -1
  157. pyegeria/core/load_config.py +37 -0
  158. pyegeria/{logging_configuration.py → core/logging_configuration.py} +1 -1
  159. pyegeria/core/mcp_adapter.py +144 -0
  160. pyegeria/core/mcp_server.py +212 -0
  161. pyegeria/core/utils.py +405 -0
  162. pyegeria/{_client.py → deprecated/_client.py} +24 -25
  163. pyegeria/{_deprecated_gov_engine.py → deprecated/_deprecated_gov_engine.py} +16 -16
  164. pyegeria/{classification_manager_omvs.py → deprecated/classification_manager_omvs.py} +1987 -1877
  165. pyegeria/{output_formatter.py → deprecated/output_formatter_with_machine_keys.py} +298 -45
  166. pyegeria/{runtime_manager_omvs.py → deprecated/runtime_manager_omvs.py} +155 -171
  167. pyegeria/{valid_metadata_omvs.py → deprecated/valid_metadata_omvs.py} +93 -93
  168. pyegeria/{x_action_author_omvs.py → deprecated/x_action_author_omvs.py} +2 -3
  169. pyegeria/egeria_cat_client.py +26 -70
  170. pyegeria/egeria_client.py +130 -93
  171. pyegeria/egeria_config_client.py +40 -46
  172. pyegeria/egeria_tech_client.py +141 -54
  173. pyegeria/models/__init__.py +150 -0
  174. pyegeria/{models.py → models/models.py} +156 -20
  175. pyegeria/omvs/__init__.py +84 -0
  176. pyegeria/omvs/action_author.py +342 -0
  177. pyegeria/omvs/actor_manager.py +5980 -0
  178. pyegeria/omvs/asset_catalog.py +842 -0
  179. pyegeria/omvs/asset_maker.py +2736 -0
  180. pyegeria/omvs/automated_curation.py +4403 -0
  181. pyegeria/omvs/classification_manager.py +11213 -0
  182. pyegeria/{collection_manager.py → omvs/collection_manager.py} +1334 -1160
  183. pyegeria/omvs/community_matters_omvs.py +468 -0
  184. pyegeria/{core_omag_server_config.py → omvs/core_omag_server_config.py} +157 -157
  185. pyegeria/{data_designer.py → omvs/data_designer.py} +1115 -660
  186. pyegeria/omvs/data_discovery.py +869 -0
  187. pyegeria/omvs/data_engineer.py +372 -0
  188. pyegeria/omvs/digital_business.py +1133 -0
  189. pyegeria/omvs/external_links.py +1752 -0
  190. pyegeria/omvs/feedback_manager.py +834 -0
  191. pyegeria/{full_omag_server_config.py → omvs/full_omag_server_config.py} +73 -69
  192. pyegeria/{glossary_manager.py → omvs/glossary_manager.py} +857 -519
  193. pyegeria/{governance_officer.py → omvs/governance_officer.py} +964 -468
  194. pyegeria/omvs/lineage_linker.py +314 -0
  195. pyegeria/omvs/location_arena.py +1525 -0
  196. pyegeria/omvs/metadata_expert.py +668 -0
  197. pyegeria/omvs/metadata_explorer_omvs.py +2943 -0
  198. pyegeria/omvs/my_profile.py +1042 -0
  199. pyegeria/omvs/notification_manager.py +358 -0
  200. pyegeria/omvs/people_organizer.py +394 -0
  201. pyegeria/{platform_services.py → omvs/platform_services.py} +113 -193
  202. pyegeria/omvs/product_manager.py +1825 -0
  203. pyegeria/omvs/project_manager.py +1907 -0
  204. pyegeria/omvs/reference_data.py +1140 -0
  205. pyegeria/omvs/registered_info.py +334 -0
  206. pyegeria/omvs/runtime_manager.py +2817 -0
  207. pyegeria/omvs/schema_maker.py +446 -0
  208. pyegeria/{server_operations.py → omvs/server_operations.py} +27 -26
  209. pyegeria/{solution_architect_omvs.py → omvs/solution_architect.py} +1886 -1505
  210. pyegeria/omvs/specification_properties.py +37 -0
  211. pyegeria/omvs/subject_area.py +1042 -0
  212. pyegeria/omvs/template_manager_omvs.py +236 -0
  213. pyegeria/omvs/time_keeper.py +1761 -0
  214. pyegeria/omvs/valid_metadata.py +3221 -0
  215. pyegeria/omvs/valid_metadata_lists.py +37 -0
  216. pyegeria/omvs/valid_type_lists.py +37 -0
  217. pyegeria/view/__init__.py +28 -0
  218. pyegeria/{_output_format_models.py → view/_output_format_models.py} +160 -24
  219. pyegeria/view/_output_formats.py +14 -0
  220. pyegeria/view/base_report_formats.py +2719 -0
  221. pyegeria/view/dr_egeria_reports.py +56 -0
  222. pyegeria/view/format_set_executor.py +397 -0
  223. pyegeria/{md_processing_utils.py → view/md_processing_utils.py} +5 -5
  224. pyegeria/{mermaid_utilities.py → view/mermaid_utilities.py} +2 -154
  225. pyegeria/view/output_formatter.py +1297 -0
  226. pyegeria-5.5.3.3.dist-info/METADATA +218 -0
  227. pyegeria-5.5.3.3.dist-info/RECORD +241 -0
  228. {pyegeria-5.4.0.28.dist-info → pyegeria-5.5.3.3.dist-info}/WHEEL +2 -1
  229. pyegeria-5.5.3.3.dist-info/entry_points.txt +103 -0
  230. pyegeria-5.5.3.3.dist-info/top_level.txt +4 -0
  231. commands/cat/.DS_Store +0 -0
  232. commands/cat/.env +0 -8
  233. commands/cat/README.md +0 -16
  234. commands/cat/debug_log +0 -1126
  235. commands/cat/debug_log.2025-08-18_11-34-38_088636.zip +0 -0
  236. commands/cat/list_categories.py +0 -192
  237. commands/cat/logs/pyegeria.log +0 -4
  238. commands/cli/debug_log +0 -0
  239. commands/cli/debug_log.log +0 -0
  240. commands/cli/txt_custom_v2.tcss +0 -19
  241. commands/my/README.md +0 -17
  242. commands/ops/README.md +0 -24
  243. commands/ops/logs/pyegeria.log +0 -0
  244. commands/ops/monitor_asset_events.py +0 -108
  245. commands/tech/README.md +0 -24
  246. md_processing/.DS_Store +0 -0
  247. md_processing/dr-egeria-outbox/Collections-2025-08-12-13-30-37.md +0 -163
  248. md_processing/dr-egeria-outbox/Collections-2025-08-12-13-35-58.md +0 -474
  249. md_processing/dr_egeria_inbox/Derive-Dr-Gov-Defs.md +0 -8
  250. md_processing/dr_egeria_inbox/Dr.Egeria Templates.md +0 -873
  251. md_processing/dr_egeria_inbox/arch_test.md +0 -57
  252. md_processing/dr_egeria_inbox/archive/dr_egeria_intro.md +0 -254
  253. md_processing/dr_egeria_inbox/archive/dr_egeria_intro_more_terms.md +0 -696
  254. md_processing/dr_egeria_inbox/archive/dr_egeria_intro_part1.md +0 -254
  255. md_processing/dr_egeria_inbox/archive/dr_egeria_intro_part2.md +0 -298
  256. md_processing/dr_egeria_inbox/archive/dr_egeria_intro_part3.md +0 -608
  257. md_processing/dr_egeria_inbox/archive/dr_egeria_intro_part4.md +0 -94
  258. md_processing/dr_egeria_inbox/archive/freddie_intro.md +0 -284
  259. md_processing/dr_egeria_inbox/archive/freddie_intro_orig.md +0 -275
  260. md_processing/dr_egeria_inbox/archive/test-term.md +0 -110
  261. md_processing/dr_egeria_inbox/cat_test.md +0 -100
  262. md_processing/dr_egeria_inbox/collections.md +0 -39
  263. md_processing/dr_egeria_inbox/data_designer_debug.log +0 -6
  264. md_processing/dr_egeria_inbox/data_designer_out.md +0 -60
  265. md_processing/dr_egeria_inbox/data_designer_search_test.md +0 -11
  266. md_processing/dr_egeria_inbox/data_field.md +0 -54
  267. md_processing/dr_egeria_inbox/data_spec.md +0 -77
  268. md_processing/dr_egeria_inbox/data_spec_test.md +0 -2406
  269. md_processing/dr_egeria_inbox/data_test.md +0 -179
  270. md_processing/dr_egeria_inbox/data_test2.md +0 -429
  271. md_processing/dr_egeria_inbox/data_test3.md +0 -462
  272. md_processing/dr_egeria_inbox/dr_egeria_data_designer_1.md +0 -124
  273. md_processing/dr_egeria_inbox/dr_egeria_intro_categories.md +0 -168
  274. md_processing/dr_egeria_inbox/dr_egeria_intro_part1.md +0 -280
  275. md_processing/dr_egeria_inbox/dr_egeria_intro_part2.md +0 -318
  276. md_processing/dr_egeria_inbox/dr_egeria_intro_part3.md +0 -1073
  277. md_processing/dr_egeria_inbox/dr_egeria_isc1.md +0 -44
  278. md_processing/dr_egeria_inbox/generated_help_report.md +0 -9
  279. md_processing/dr_egeria_inbox/glossary_creation_experiment.ipynb +0 -341
  280. md_processing/dr_egeria_inbox/glossary_list.md +0 -5
  281. md_processing/dr_egeria_inbox/glossary_search_test.md +0 -40
  282. md_processing/dr_egeria_inbox/glossary_test1.md +0 -324
  283. md_processing/dr_egeria_inbox/gov_def.md +0 -482
  284. md_processing/dr_egeria_inbox/gov_def2.md +0 -447
  285. md_processing/dr_egeria_inbox/img.png +0 -0
  286. md_processing/dr_egeria_inbox/product.md +0 -211
  287. md_processing/dr_egeria_inbox/rel.md +0 -8
  288. md_processing/dr_egeria_inbox/sb.md +0 -119
  289. md_processing/dr_egeria_inbox/solution-components.md +0 -136
  290. md_processing/dr_egeria_inbox/solution_blueprints.md +0 -118
  291. md_processing/dr_egeria_inbox/synonym_test.md +0 -42
  292. md_processing/dr_egeria_inbox/t2.md +0 -268
  293. md_processing/dr_egeria_outbox/.obsidian/app.json +0 -1
  294. md_processing/dr_egeria_outbox/.obsidian/appearance.json +0 -1
  295. md_processing/dr_egeria_outbox/.obsidian/community-plugins.json +0 -6
  296. md_processing/dr_egeria_outbox/.obsidian/core-plugins.json +0 -31
  297. md_processing/dr_egeria_outbox/.obsidian/plugins/calendar/data.json +0 -10
  298. md_processing/dr_egeria_outbox/.obsidian/plugins/calendar/main.js +0 -4459
  299. md_processing/dr_egeria_outbox/.obsidian/plugins/calendar/manifest.json +0 -10
  300. md_processing/dr_egeria_outbox/.obsidian/plugins/obsidian-kanban/data.json +0 -3
  301. md_processing/dr_egeria_outbox/.obsidian/plugins/obsidian-kanban/main.js +0 -153
  302. md_processing/dr_egeria_outbox/.obsidian/plugins/obsidian-kanban/manifest.json +0 -11
  303. md_processing/dr_egeria_outbox/.obsidian/plugins/obsidian-kanban/styles.css +0 -1
  304. md_processing/dr_egeria_outbox/.obsidian/plugins/obsidian-tasks-plugin/main.js +0 -500
  305. md_processing/dr_egeria_outbox/.obsidian/plugins/obsidian-tasks-plugin/manifest.json +0 -12
  306. md_processing/dr_egeria_outbox/.obsidian/plugins/obsidian-tasks-plugin/styles.css +0 -1
  307. md_processing/dr_egeria_outbox/.obsidian/plugins/templater-obsidian/main.js +0 -37
  308. md_processing/dr_egeria_outbox/.obsidian/plugins/templater-obsidian/manifest.json +0 -11
  309. md_processing/dr_egeria_outbox/.obsidian/plugins/templater-obsidian/styles.css +0 -220
  310. md_processing/dr_egeria_outbox/.obsidian/types.json +0 -28
  311. md_processing/dr_egeria_outbox/.obsidian/workspace.json +0 -220
  312. md_processing/dr_egeria_outbox/Untitled.canvas +0 -1
  313. md_processing/dr_egeria_outbox/friday/processed-2025-08-22 21:22-dr_egeria_intro_part1.md +0 -312
  314. md_processing/dr_egeria_outbox/friday/processed-2025-08-22 21:23-dr_egeria_intro_part1.md +0 -265
  315. md_processing/dr_egeria_outbox/friday/processed-2025-08-23 15:06-dr_egeria_intro_part1.md +0 -230
  316. md_processing/dr_egeria_outbox/friday/processed-2025-08-23 15:30-dr_egeria_intro_part1.md +0 -296
  317. md_processing/dr_egeria_outbox/friday/processed-2025-08-23 15:31-dr_egeria_intro_part1.md +0 -253
  318. md_processing/dr_egeria_outbox/friday/processed-2025-08-23 16:08-dr_egeria_intro_part2.md +0 -343
  319. md_processing/dr_egeria_outbox/friday/processed-2025-08-23 16:12-dr_egeria_intro_part2.md +0 -343
  320. md_processing/dr_egeria_outbox/monday/processed-2025-08-19 07:05-product.md +0 -426
  321. md_processing/dr_egeria_outbox/monday/processed-2025-08-19 07:56-product.md +0 -212
  322. md_processing/dr_egeria_outbox/monday/processed-2025-08-19 09:43-product.md +0 -201
  323. md_processing/dr_egeria_outbox/sunday/processed-2025-07-20 14:55-product.md +0 -77
  324. md_processing/dr_egeria_outbox/sunday/processed-2025-07-20 15:05-product.md +0 -75
  325. md_processing/dr_egeria_outbox/sunday/processed-2025-07-20 15:11-product.md +0 -74
  326. md_processing/dr_egeria_outbox/sunday/processed-2025-07-20 20:40-collections.md +0 -49
  327. md_processing/dr_egeria_outbox/thursday/processed-2025-07-17 15:00-Derive-Dr-Gov-Defs.md +0 -719
  328. md_processing/dr_egeria_outbox/thursday/processed-2025-07-17 20:13-Derive-Dr-Gov-Defs.md +0 -41
  329. md_processing/dr_egeria_outbox/thursday/processed-2025-07-17 20:14-Derive-Dr-Gov-Defs.md +0 -33
  330. md_processing/dr_egeria_outbox/thursday/processed-2025-07-17 20:50-Derive-Dr-Gov-Defs.md +0 -192
  331. md_processing/dr_egeria_outbox/thursday/processed-2025-07-17 22:08-gov_def2.md +0 -486
  332. md_processing/dr_egeria_outbox/thursday/processed-2025-07-17 22:10-gov_def2.md +0 -486
  333. md_processing/dr_egeria_outbox/thursday/processed-2025-07-18 08:53-gov_def2.md +0 -486
  334. md_processing/dr_egeria_outbox/thursday/processed-2025-07-18 08:54-gov_def2.md +0 -486
  335. md_processing/dr_egeria_outbox/thursday/processed-2025-07-18 09:03-gov_def2.md +0 -486
  336. md_processing/dr_egeria_outbox/thursday/processed-2025-07-18 09:06-gov_def2.md +0 -486
  337. md_processing/dr_egeria_outbox/thursday/processed-2025-07-18 09:10-gov_def2.md +0 -486
  338. md_processing/dr_egeria_outbox/tuesday/processed-2025-07-16 19:15-gov_def2.md +0 -527
  339. md_processing/dr_egeria_outbox/tuesday/processed-2025-07-17 12:08-gov_def2.md +0 -527
  340. md_processing/dr_egeria_outbox/tuesday/processed-2025-07-17 14:27-gov_def2.md +0 -485
  341. md_processing/dr_egeria_outbox/tuesday/processed-2025-08-19 10:55-product.md +0 -209
  342. md_processing/family_docs/Data Designer/Create_Data_Class.md +0 -164
  343. md_processing/family_docs/Data Designer/Create_Data_Dictionary.md +0 -30
  344. md_processing/family_docs/Data Designer/Create_Data_Field.md +0 -162
  345. md_processing/family_docs/Data Designer/Create_Data_Specification.md +0 -36
  346. md_processing/family_docs/Data Designer/Create_Data_Structure.md +0 -38
  347. md_processing/family_docs/Data Designer/View_Data_Classes.md +0 -78
  348. md_processing/family_docs/Data Designer/View_Data_Dictionaries.md +0 -78
  349. md_processing/family_docs/Data Designer/View_Data_Fields.md +0 -78
  350. md_processing/family_docs/Data Designer/View_Data_Specifications.md +0 -78
  351. md_processing/family_docs/Data Designer/View_Data_Structures.md +0 -78
  352. md_processing/family_docs/Data Designer.md +0 -842
  353. md_processing/family_docs/Digital Product Manager/Add_Member->Collection.md +0 -42
  354. md_processing/family_docs/Digital Product Manager/Attach_Collection->Resource.md +0 -36
  355. md_processing/family_docs/Digital Product Manager/Create_Agreement.md +0 -96
  356. md_processing/family_docs/Digital Product Manager/Create_Data_Sharing_Agreement.md +0 -72
  357. md_processing/family_docs/Digital Product Manager/Create_DigitalSubscription.md +0 -102
  358. md_processing/family_docs/Digital Product Manager/Create_Digital_Product.md +0 -134
  359. md_processing/family_docs/Digital Product Manager/Link_Agreement_Items.md +0 -60
  360. md_processing/family_docs/Digital Product Manager/Link_Contracts.md +0 -26
  361. md_processing/family_docs/Digital Product Manager/Link_Digital_Product_-_Digital_Product.md +0 -30
  362. md_processing/family_docs/Digital Product Manager/Link_Subscribers.md +0 -48
  363. md_processing/family_docs/Digital Product Manager.md +0 -668
  364. md_processing/family_docs/Glossary/Attach_Category_Parent.md +0 -18
  365. md_processing/family_docs/Glossary/Attach_Term-Term_Relationship.md +0 -26
  366. md_processing/family_docs/Glossary/Create_Category.md +0 -38
  367. md_processing/family_docs/Glossary/Create_Glossary.md +0 -42
  368. md_processing/family_docs/Glossary/Create_Term.md +0 -70
  369. md_processing/family_docs/Glossary.md +0 -206
  370. md_processing/family_docs/Governance Officer/Create_Business_Imperative.md +0 -106
  371. md_processing/family_docs/Governance Officer/Create_Certification_Type.md +0 -112
  372. md_processing/family_docs/Governance Officer/Create_Governance_Approach.md +0 -114
  373. md_processing/family_docs/Governance Officer/Create_Governance_Obligation.md +0 -114
  374. md_processing/family_docs/Governance Officer/Create_Governance_Principle.md +0 -114
  375. md_processing/family_docs/Governance Officer/Create_Governance_Procedure.md +0 -128
  376. md_processing/family_docs/Governance Officer/Create_Governance_Process.md +0 -122
  377. md_processing/family_docs/Governance Officer/Create_Governance_Processing_Purpose.md +0 -106
  378. md_processing/family_docs/Governance Officer/Create_Governance_Responsibility.md +0 -122
  379. md_processing/family_docs/Governance Officer/Create_Governance_Rule.md +0 -122
  380. md_processing/family_docs/Governance Officer/Create_Governance_Strategy.md +0 -106
  381. md_processing/family_docs/Governance Officer/Create_License_Type.md +0 -112
  382. md_processing/family_docs/Governance Officer/Create_Naming_Standard_Rule.md +0 -122
  383. md_processing/family_docs/Governance Officer/Create_Regulation_Article.md +0 -106
  384. md_processing/family_docs/Governance Officer/Create_Regulation_Definition.md +0 -118
  385. md_processing/family_docs/Governance Officer/Create_Security_Access_Control.md +0 -114
  386. md_processing/family_docs/Governance Officer/Create_Security_Group.md +0 -120
  387. md_processing/family_docs/Governance Officer/Create_Service_Level_Objectives.md +0 -122
  388. md_processing/family_docs/Governance Officer/Create_Threat_Definition.md +0 -106
  389. md_processing/family_docs/Governance Officer/Link_Governance_Controls.md +0 -32
  390. md_processing/family_docs/Governance Officer/Link_Governance_Drivers.md +0 -32
  391. md_processing/family_docs/Governance Officer/Link_Governance_Policies.md +0 -32
  392. md_processing/family_docs/Governance Officer/View_Governance_Definitions.md +0 -82
  393. md_processing/family_docs/Governance Officer.md +0 -2412
  394. md_processing/family_docs/Solution Architect/Create_Information_Supply_Chain.md +0 -70
  395. md_processing/family_docs/Solution Architect/Create_Solution_Blueprint.md +0 -44
  396. md_processing/family_docs/Solution Architect/Create_Solution_Component.md +0 -96
  397. md_processing/family_docs/Solution Architect/Create_Solution_Role.md +0 -66
  398. md_processing/family_docs/Solution Architect/Link_Information_Supply_Chain_Peers.md +0 -32
  399. md_processing/family_docs/Solution Architect/Link_Solution_Component_Peers.md +0 -32
  400. md_processing/family_docs/Solution Architect/View_Information_Supply_Chains.md +0 -32
  401. md_processing/family_docs/Solution Architect/View_Solution_Blueprints.md +0 -32
  402. md_processing/family_docs/Solution Architect/View_Solution_Components.md +0 -32
  403. md_processing/family_docs/Solution Architect/View_Solution_Roles.md +0 -32
  404. md_processing/family_docs/Solution Architect.md +0 -490
  405. md_processing/md_processing_utils/debug_log +0 -574
  406. md_processing/md_processing_utils/debug_log.log +0 -0
  407. md_processing/md_processing_utils/dr-egeria-help-2025-07-17T17:22:09.md +0 -2065
  408. md_processing/md_processing_utils/generated_help_terms.md +0 -842
  409. pyegeria/.DS_Store +0 -0
  410. pyegeria/README.md +0 -35
  411. pyegeria/_client_new.py +0 -1102
  412. pyegeria/_output_formats.py +0 -730
  413. pyegeria/asset_catalog_omvs.py +0 -864
  414. pyegeria/automated_curation_omvs.py +0 -3765
  415. pyegeria/config.py +0 -523
  416. pyegeria/egeria_my_client.py +0 -91
  417. pyegeria/feedback_manager_omvs.py +0 -4573
  418. pyegeria/load_config_orig.py +0 -218
  419. pyegeria/md_processing_helpers.py +0 -58
  420. pyegeria/md_processing_utils_orig.py +0 -1103
  421. pyegeria/metadata_explorer_omvs.py +0 -2326
  422. pyegeria/my_profile_omvs.py +0 -1022
  423. pyegeria/project_manager.py +0 -1591
  424. pyegeria/registered_info.py +0 -167
  425. pyegeria/template_manager_omvs.py +0 -1414
  426. pyegeria/utils.py +0 -256
  427. pyegeria-5.4.0.28.dist-info/METADATA +0 -77
  428. pyegeria-5.4.0.28.dist-info/RECORD +0 -343
  429. pyegeria-5.4.0.28.dist-info/entry_points.txt +0 -105
  430. /commands/cat/debug_log.log → /pyegeria/deprecated/__init__.py +0 -0
  431. /pyegeria/{_exceptions.py → deprecated/_exceptions.py} +0 -0
  432. /pyegeria/{collection_models.py → models/collection_models.py} +0 -0
  433. {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()