ApiLogicServer 15.0.0__py3-none-any.whl → 15.0.9__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.
- api_logic_server_cli/add_cust/add_cust.py +8 -2
- api_logic_server_cli/api_logic_server.py +2 -1
- api_logic_server_cli/api_logic_server_info.yaml +3 -3
- api_logic_server_cli/create_from_model/__pycache__/dbml.cpython-312.pyc +0 -0
- api_logic_server_cli/create_from_model/dbml.py +1 -0
- api_logic_server_cli/genai/genai_svcs.py +5 -2
- api_logic_server_cli/prototypes/base/api/api_discovery/mcp_discovery.py +63 -24
- api_logic_server_cli/prototypes/base/config/logging.yml +5 -0
- api_logic_server_cli/prototypes/base/config/server_setup.py +73 -0
- api_logic_server_cli/prototypes/base/integration/mcp/examples/mcp_discovery_response.json +150 -0
- api_logic_server_cli/prototypes/base/integration/mcp/examples/mcp_request.prompt +46 -0
- api_logic_server_cli/prototypes/base/integration/mcp/examples/mcp_tool_context_response.json +34 -0
- api_logic_server_cli/prototypes/base/integration/mcp/examples/mcp_tool_context_response_get.json +18 -0
- api_logic_server_cli/prototypes/base/integration/mcp/mcp_client_executor.py +129 -275
- api_logic_server_cli/prototypes/basic_demo/customizations/logic/logic_discovery/mcp_client_executor_request.py +11 -282
- api_logic_server_cli/prototypes/basic_demo/customizations/ui/admin/admin.yaml +3 -3
- api_logic_server_cli/prototypes/basic_demo/customizations/ui/admin/home.js +48 -0
- api_logic_server_cli/prototypes/manager/system/genai/mcp_learning/mcp.prompt +12 -0
- {apilogicserver-15.0.0.dist-info → apilogicserver-15.0.9.dist-info}/METADATA +1 -1
- {apilogicserver-15.0.0.dist-info → apilogicserver-15.0.9.dist-info}/RECORD +25 -31
- api_logic_server_cli/prototypes/base/integration/mcp/README_mcp.md +0 -15
- api_logic_server_cli/prototypes/base/integration/mcp/test_notes.txt +0 -37
- api_logic_server_cli/prototypes/basic_demo/customizations/api/api_discovery/mcp_discovery.py +0 -96
- api_logic_server_cli/prototypes/basic_demo/customizations/config/server_setup.py +0 -388
- api_logic_server_cli/prototypes/basic_demo/customizations/integration/mcp/.DS_Store +0 -0
- api_logic_server_cli/prototypes/basic_demo/customizations/integration/mcp/README_mcp.md +0 -15
- api_logic_server_cli/prototypes/basic_demo/customizations/integration/mcp/Zmcp_client_executor.py +0 -294
- api_logic_server_cli/prototypes/basic_demo/customizations/integration/mcp/mcp_schema.txt +0 -47
- api_logic_server_cli/prototypes/basic_demo/customizations/integration/mcp/mcp_server_discovery.json +0 -9
- api_logic_server_cli/prototypes/basic_demo/customizations/integration/mcp/mcp_tool_context.json +0 -25
- api_logic_server_cli/prototypes/basic_demo/customizations/integration/mcp/test_notes.txt +0 -37
- /api_logic_server_cli/prototypes/base/integration/mcp/{mcp_schema.txt → examples/mcp_schema.txt} +0 -0
- {apilogicserver-15.0.0.dist-info → apilogicserver-15.0.9.dist-info}/WHEEL +0 -0
- {apilogicserver-15.0.0.dist-info → apilogicserver-15.0.9.dist-info}/entry_points.txt +0 -0
- {apilogicserver-15.0.0.dist-info → apilogicserver-15.0.9.dist-info}/licenses/LICENSE +0 -0
- {apilogicserver-15.0.0.dist-info → apilogicserver-15.0.9.dist-info}/top_level.txt +0 -0
|
@@ -1,279 +1,17 @@
|
|
|
1
1
|
"""
|
|
2
|
-
|
|
3
|
-
which takes a natural language query and converts it into a tool context block:
|
|
4
|
-
|
|
5
|
-
1. Discovers MCP servers (from config)
|
|
6
|
-
2. Queries OpenAI's GPT-4 model to obtain the tool context based on a provided schema and a natural language query
|
|
7
|
-
3. Processes the tool context (calls the indicated MCP (als) endpoints)
|
|
8
|
-
|
|
9
|
-
Notes:
|
|
10
|
-
* See: integration/mcp/README_mcp.md
|
|
11
|
-
* python api_logic_server_run.py
|
|
12
|
-
|
|
2
|
+
Invokes MCP client executor to process MCP requests when a new SysMcp row is inserted.
|
|
13
3
|
"""
|
|
14
4
|
|
|
15
5
|
import json
|
|
16
|
-
import os,
|
|
6
|
+
import os, logging
|
|
17
7
|
from typing import Dict, List
|
|
18
8
|
import openai
|
|
19
9
|
import requests
|
|
20
|
-
from logic_bank.exec_row_logic.logic_row import LogicRow
|
|
21
10
|
from logic_bank.logic_bank import Rule
|
|
11
|
+
from logic_bank.exec_row_logic.logic_row import LogicRow
|
|
22
12
|
from database import models
|
|
23
13
|
from logic_bank.util import ConstraintException
|
|
24
|
-
|
|
25
|
-
# Set your OpenAI API key
|
|
26
|
-
openai.api_key = os.getenv("APILOGICSERVER_CHATGPT_APIKEY")
|
|
27
|
-
|
|
28
|
-
server_url = os.getenv("APILOGICSERVER_URL", "http://localhost:5656/api")
|
|
29
|
-
|
|
30
|
-
# debug settings
|
|
31
|
-
test_type = 'orchestration' # 'simple_get' or 'orchestration'
|
|
32
|
-
create_tool_context_from_llm = True
|
|
33
|
-
''' set to False to bypass LLM call and save 2-3 secs in testing '''
|
|
34
|
-
use_test_schema = False
|
|
35
|
-
''' True means bypass discovery, use hard-coded schedma file '''
|
|
36
|
-
|
|
37
|
-
def discover_mcp_servers():
|
|
38
|
-
""" Discover the MCP servers by calling the /api/.well-known/mcp.json endpoint.
|
|
39
|
-
This function retrieves the list of available MCP servers and their capabilities.
|
|
40
|
-
"""
|
|
41
|
-
global server_url, use_test_schema
|
|
42
|
-
|
|
43
|
-
# create schema_text (for prompt), by reading integration/mcp/mcp_schema.txt
|
|
44
|
-
|
|
45
|
-
# find the servers - read the mcp_server_discovery.json file
|
|
46
|
-
discovery_file_path = os.path.join(os.path.dirname(__file__), "../../integration/mcp/mcp_server_discovery.json")
|
|
47
|
-
try:
|
|
48
|
-
with open(discovery_file_path, "r") as discovery_file:
|
|
49
|
-
discovery_data = json.load(discovery_file)
|
|
50
|
-
print(f"\n1. Discovered MCP servers from config file: {discovery_file_path}:" + json.dumps(discovery_data, indent=4))
|
|
51
|
-
except FileNotFoundError:
|
|
52
|
-
print(f"Discovery file not found at {discovery_file_path}.")
|
|
53
|
-
except json.JSONDecodeError as e:
|
|
54
|
-
print(f"Error decoding JSON from {discovery_file_path}: {e}")
|
|
55
|
-
|
|
56
|
-
for each_server in discovery_data["servers"]:
|
|
57
|
-
discovery_url = each_server["schema_url"]
|
|
58
|
-
|
|
59
|
-
# Call the discovery_url to get the MCP/API schema
|
|
60
|
-
try:
|
|
61
|
-
response = requests.get(discovery_url)
|
|
62
|
-
if response.status_code == 200:
|
|
63
|
-
api_schema = response.json()
|
|
64
|
-
print()
|
|
65
|
-
request_print = json.dumps(api_schema, indent=4)[0:400] + '\n... etc' # limit for readability
|
|
66
|
-
print(f"\n\nAPI Schema from discovery schema_url: {discovery_url}:\n" + request_print)
|
|
67
|
-
else:
|
|
68
|
-
print(f"Failed to retrieve API schema from {discovery_url}: {response.status_code}")
|
|
69
|
-
except requests.RequestException as e:
|
|
70
|
-
print(f"Error calling OpenAPI URL: {e}")
|
|
71
|
-
return json.dumps(api_schema)
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
def get_user_nl_query_and_training(query: str):
|
|
75
|
-
""" Get the natural language query from the user.
|
|
76
|
-
Add training for the LLM to generate a tool context block.
|
|
77
|
-
|
|
78
|
-
"""
|
|
79
|
-
|
|
80
|
-
global test_type
|
|
81
|
-
# read file docs/mcp_learning/mcp.prompt
|
|
82
|
-
prompt_file_path = os.path.join(os.path.dirname(__file__), "../../docs/mcp_learning/mcp.prompt")
|
|
83
|
-
if os.path.exists(prompt_file_path):
|
|
84
|
-
with open(prompt_file_path, "r") as prompt_file:
|
|
85
|
-
training_prompt = prompt_file.read()
|
|
86
|
-
# print(f"\nLoaded training prompt from {prompt_file_path}:\n{training_prompt}")
|
|
87
|
-
else:
|
|
88
|
-
training_prompt = ""
|
|
89
|
-
print(f"Prompt file not found at {prompt_file_path}.")
|
|
90
|
-
return query + "\n\n" + training_prompt
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
def query_llm_with_nl(schema_text, nl_query):
|
|
94
|
-
"""
|
|
95
|
-
Query the LLM with a natural language query and schema text to generate a tool context block.
|
|
96
|
-
|
|
97
|
-
It handles both orchestration and simple GET requests.
|
|
98
|
-
"""
|
|
99
|
-
|
|
100
|
-
global test_type, create_tool_context_from_llm
|
|
101
|
-
|
|
102
|
-
content = f"Natural language query:\n {nl_query}\nSchema:\n{schema_text}"
|
|
103
|
-
messages = [
|
|
104
|
-
{
|
|
105
|
-
"role": "system",
|
|
106
|
-
"content": "You are an API planner that converts natural language queries into MCP Tool Context blocks using JSON:API. Return only the tool context as JSON."
|
|
107
|
-
},
|
|
108
|
-
{
|
|
109
|
-
"role": "user",
|
|
110
|
-
"content": f"{content}"
|
|
111
|
-
}
|
|
112
|
-
]
|
|
113
|
-
|
|
114
|
-
request_print = content[0:1200] + '\n... etc' # limit for readability
|
|
115
|
-
print("\n\n2a. LLM request:\n", request_print)
|
|
116
|
-
# print("\n2b. NL Query:\n", nl_query)
|
|
117
|
-
# print("\n2c. schema_text: (truncated) \n")
|
|
118
|
-
# schema_print = json.dumps(json.loads(schema_text), indent=4)[:400] # limit for readability
|
|
119
|
-
# print(schema_print)
|
|
120
|
-
|
|
121
|
-
if create_tool_context_from_llm: # takes 2-3 seconds...
|
|
122
|
-
response = openai.chat.completions.create(
|
|
123
|
-
model="gpt-4",
|
|
124
|
-
messages=messages,
|
|
125
|
-
temperature=0.2
|
|
126
|
-
)
|
|
127
|
-
|
|
128
|
-
tool_context_str = response.choices[0].message.content
|
|
129
|
-
tool_context_str_no_cr = tool_context_str.replace("\n", '') # convert single quotes to double quotes
|
|
130
|
-
try:
|
|
131
|
-
tool_context = json.loads(tool_context_str_no_cr)
|
|
132
|
-
except json.JSONDecodeError:
|
|
133
|
-
print("Failed to decode JSON from response:", tool_context_str)
|
|
134
|
-
return None
|
|
135
|
-
|
|
136
|
-
print("\n2d. generated tool context from LLM:\n", json.dumps(tool_context, indent=4))
|
|
137
|
-
|
|
138
|
-
if "resources" not in tool_context:
|
|
139
|
-
raise ConstraintException("GenAI Error - LLM response does not contain 'resources'.")
|
|
140
|
-
return tool_context
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
def process_tool_context(tool_context):
|
|
144
|
-
""" Process the orchestration request by executing multiple tool context blocks.
|
|
145
|
-
This executes the tool context blocks against a live JSON:API server.
|
|
146
|
-
It handles both GET and POST requests, and it can
|
|
147
|
-
orchestrate multiple requests based on the provided tool context.
|
|
148
|
-
|
|
149
|
-
Note the orchestration is processed by the client executor (here), not the server executor.
|
|
150
|
-
|
|
151
|
-
Research:
|
|
152
|
-
|
|
153
|
-
1. How is this a "USB", since the request was specific about JSON:API?
|
|
154
|
-
2. How is it clear to loop through the tool_context[0] and call tool_context[1]?
|
|
155
|
-
"""
|
|
156
|
-
global server_url
|
|
157
|
-
|
|
158
|
-
def get_query_param_filter(query_params):
|
|
159
|
-
""" return json:api filter
|
|
160
|
-
|
|
161
|
-
eg
|
|
162
|
-
curl -qg 'http://localhost:5656/api/Order?filter=[{"name":"date_shipped","op":"eq","val":null},{"name":"CreatedOn","op":"lt","val":"2023-07-14"}]'
|
|
163
|
-
|
|
164
|
-
curl -qg 'http://localhost:5656/api/Order?filter=[{"name":"date_shipped","op":"gt","val":"2023-07-14"}]'
|
|
165
|
-
curl -qg 'http://localhost:5656/api/Order?filter=[{"name":"date_shipped","op":"eq","val":null}]'
|
|
166
|
-
curl -qg 'http://localhost:5656/api/Customer?filter=[{"name":"credit_limit","op":"gt","val":"1000"}]'
|
|
167
|
-
|
|
168
|
-
query_params might be simple:
|
|
169
|
-
"query_params": [ {"name": "credit_limit", "op": "gt", "val": "1000"} ]
|
|
170
|
-
==> ?filter=[{"name":"credit_limit","op":"gt","val":"1000"}]
|
|
171
|
-
|
|
172
|
-
or a list:
|
|
173
|
-
"query_params": [
|
|
174
|
-
{
|
|
175
|
-
"name": "date_shipped",
|
|
176
|
-
"op": "eq",
|
|
177
|
-
"val": None
|
|
178
|
-
},
|
|
179
|
-
{
|
|
180
|
-
"name": "date_created",
|
|
181
|
-
"op": "lt",
|
|
182
|
-
"val": "2023-07-14"
|
|
183
|
-
}
|
|
184
|
-
],
|
|
185
|
-
|
|
186
|
-
"""
|
|
187
|
-
|
|
188
|
-
added_rows = 0
|
|
189
|
-
|
|
190
|
-
query_param_filter = ''
|
|
191
|
-
assert isinstance(query_params, list), "Query Params filter expected to be a list"
|
|
192
|
-
query_param_filter = 'filter=' + str(query_params)
|
|
193
|
-
# use urlencode to convert to JSON:API format...
|
|
194
|
-
# val urllib.parse.quote() or urllib.parse.urlencode()
|
|
195
|
-
# tool instructions... filtering, email etc "null"
|
|
196
|
-
query_param_filter = query_param_filter.replace("'", '"') # convert single quotes to double quotes
|
|
197
|
-
query_param_filter = query_param_filter.replace("None", 'null')
|
|
198
|
-
query_param_filter = query_param_filter.replace('"null"', 'null')
|
|
199
|
-
# query_param_filter = query_param_filter.replace("date_created", 'CreatedOn') # TODO - why this name?
|
|
200
|
-
return query_param_filter # end get_query_param_filter
|
|
201
|
-
|
|
202
|
-
def move_fields(src: dict, dest: dict, context_data: dict):
|
|
203
|
-
""" Move fields from src to dest, replacing any variables with their values from context_data."""
|
|
204
|
-
for variable_name, value in src.items():
|
|
205
|
-
move_value = value
|
|
206
|
-
if move_value.startswith("{") and move_value.endswith("}"):
|
|
207
|
-
# strip the braces, and get the name after the first dot, # eg: "{Order.customer_id}" ==> "customer_id"``
|
|
208
|
-
move_name = move_value[1:-1] # strip the braces
|
|
209
|
-
if '.' in move_value:
|
|
210
|
-
move_name = move_name.split('.', 1)[1]
|
|
211
|
-
move_value = context_data['attributes'][move_name]
|
|
212
|
-
dest[variable_name] = move_value
|
|
213
|
-
return dest
|
|
214
|
-
|
|
215
|
-
def print_get_response(query_param_filter, mcp_response):
|
|
216
|
-
""" Print the response from the GET request. """
|
|
217
|
-
print("\n3. MCP Server (als) GET filter(query_param_filter):\n", query_param_filter)
|
|
218
|
-
print(" GET Response:\n", mcp_response.text)
|
|
219
|
-
results : List[Dict] = mcp_response.json()['data']
|
|
220
|
-
# print results in a table format
|
|
221
|
-
if results:
|
|
222
|
-
# Get all unique keys from all result dicts
|
|
223
|
-
keys = set()
|
|
224
|
-
for row in results:
|
|
225
|
-
if isinstance(row, dict):
|
|
226
|
-
keys.update(row.keys())
|
|
227
|
-
keys = list(keys)
|
|
228
|
-
# Print header
|
|
229
|
-
print("\n| " + " | ".join(keys) + " |")
|
|
230
|
-
print("|" + "|".join(["---"] * len(keys)) + "|")
|
|
231
|
-
# Print rows
|
|
232
|
-
for row in results:
|
|
233
|
-
print("| " + " | ".join(str(row.get(k, "")) for k in keys) + " |")
|
|
234
|
-
else:
|
|
235
|
-
print("No results found.")
|
|
236
|
-
|
|
237
|
-
assert isinstance(tool_context, (dict, list)), "Tool context expected to be a dictionary"
|
|
238
|
-
context_data = {}
|
|
239
|
-
added_rows = 0
|
|
240
|
-
|
|
241
|
-
for each_block in tool_context["resources"]:
|
|
242
|
-
if process_tool_context := True:
|
|
243
|
-
if each_block["method"] == "GET":
|
|
244
|
-
query_param_filter = get_query_param_filter(each_block["query_params"])
|
|
245
|
-
headers = {"Content-Type": "application/vnd.api+json"}
|
|
246
|
-
if "headers" in each_block:
|
|
247
|
-
headers.update(each_block["headers"])
|
|
248
|
-
mcp_response = requests.get(
|
|
249
|
-
url = each_block["base_url"] + each_block["path"],
|
|
250
|
-
headers=headers,
|
|
251
|
-
params=query_param_filter
|
|
252
|
-
)
|
|
253
|
-
context_data = mcp_response.json()['data'] # result rows...
|
|
254
|
-
print_get_response(query_param_filter, mcp_response)
|
|
255
|
-
elif each_block["method"] in ["POST"]:
|
|
256
|
-
for each_order in context_data:
|
|
257
|
-
url = each_block["base_url"] + each_block["path"]
|
|
258
|
-
json_update_data = { 'data': {"type": each_block["path"][1:], 'attributes': {} } }
|
|
259
|
-
json_update_data_attributes = json_update_data["data"]["attributes"]
|
|
260
|
-
move_fields( src= each_block["body"], dest=json_update_data_attributes, context_data=each_order)
|
|
261
|
-
# eg: POST http://localhost:5656/api/SysEmail {'data': {'type': 'SysEmail', 'attributes': {'customer_id': 5, 'message': {'to': '{{ order.customer_id }}', 'subject': 'Discount for your order', 'body': 'Dear customer, you have a discount for your recent order. Thank you for shopping with us.'}}}}
|
|
262
|
-
headers = {"Content-Type": "application/vnd.api+json"}
|
|
263
|
-
if "headers" in each_block:
|
|
264
|
-
headers.update(each_block["headers"])
|
|
265
|
-
mcp_response = requests.post(
|
|
266
|
-
url=url,
|
|
267
|
-
headers=headers,
|
|
268
|
-
json=json_update_data
|
|
269
|
-
)
|
|
270
|
-
added_rows += 1
|
|
271
|
-
pass
|
|
272
|
-
print("\n3. MCP Server (als) POST Response:\n", mcp_response.text)
|
|
273
|
-
if added_rows > 0:
|
|
274
|
-
print(f"...Added {added_rows} rows to the database; last row (only) shown above.")
|
|
275
|
-
return mcp_response
|
|
276
|
-
|
|
14
|
+
import integration.mcp.mcp_client_executor as mcp_client_executor
|
|
277
15
|
|
|
278
16
|
|
|
279
17
|
def declare_logic():
|
|
@@ -289,30 +27,21 @@ def declare_logic():
|
|
|
289
27
|
"""
|
|
290
28
|
|
|
291
29
|
|
|
292
|
-
def
|
|
30
|
+
def mcp_client_executor_event(row: models.SysMcp, old_row: models.SysMcp, logic_row: LogicRow):
|
|
293
31
|
"""
|
|
294
32
|
|
|
295
33
|
#als: create an MCP request. See https://apilogicserver.github.io/Docs/Integration-MCP/
|
|
296
34
|
|
|
297
35
|
Test:
|
|
298
|
-
*
|
|
299
|
-
* Or, use the Admin App and insert a row into SysMCP
|
|
36
|
+
* curl -X 'POST' 'http://localhost:5656/api/SysMcp/' -H 'accept: application/vnd.api+json' -H 'Content-Type: application/json' -d '{ "data": { "attributes": {"request": "List the orders date_shipped is null and CreatedOn before 2023-07-14, and send a discount email (subject: '\''Discount Offer'\'') to the customer for each one."}, "type": "SysMcp"}}'
|
|
37
|
+
* Or, use the Admin App and insert a row into SysMCP, eg:
|
|
38
|
+
* List the orders date_shipped is null and CreatedOn before 2023-07-14, and send a discount email (subject: 'Discount Offer') to the customer for each one."
|
|
300
39
|
|
|
301
40
|
Args:
|
|
302
|
-
row (Mcp): inserted
|
|
41
|
+
row (Mcp): inserted SysMcp with prompt
|
|
303
42
|
old_row (Mcp): n/a
|
|
304
43
|
logic_row (LogicRow): bundles curr/old row, with ins/upd/dlt logic
|
|
305
44
|
"""
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
query_example = "List the orders date_shipped is null and CreatedOn before 2023-07-14, and send a discount email (subject: 'Discount Offer') to the customer for each one."
|
|
309
|
-
query = row.request
|
|
310
|
-
prompt = get_user_nl_query_and_training(query)
|
|
311
|
-
|
|
312
|
-
tool_context = query_llm_with_nl(schema_text, prompt) # see: 2-tool-context-from-LLM
|
|
313
|
-
|
|
314
|
-
mcp_response = process_tool_context(tool_context) # see: 3-MCP-server response
|
|
315
|
-
|
|
316
|
-
print("\nTest complete.\n")
|
|
45
|
+
result = mcp_client_executor.mcp_client_executor(row.request)
|
|
317
46
|
|
|
318
|
-
Rule.row_event(on_class=models.SysMcp, calling=
|
|
47
|
+
Rule.row_event(on_class=models.SysMcp, calling=mcp_client_executor_event) # see above
|
|
@@ -131,13 +131,13 @@ resources:
|
|
|
131
131
|
user_key: id
|
|
132
132
|
SysMcp:
|
|
133
133
|
attributes:
|
|
134
|
+
- name: request
|
|
135
|
+
type: textarea
|
|
134
136
|
- label: ' id*'
|
|
135
137
|
name: id
|
|
136
138
|
search: true
|
|
137
139
|
sort: true
|
|
138
|
-
|
|
139
|
-
- name: request_prompt
|
|
140
|
-
- name: completion
|
|
140
|
+
show_when: isInserting == false
|
|
141
141
|
type: SysMcp
|
|
142
142
|
user_key: id
|
|
143
143
|
settings:
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
const sla_doc =
|
|
2
|
+
'<div class="MuiTypography-root jss4" style="color: rgba(0, 0, 0, 0.66)">' +
|
|
3
|
+
'<div style="text-align:center">' +
|
|
4
|
+
'<h2>Welcome to API Logic Server</h2>' +
|
|
5
|
+
'</div><br>' +
|
|
6
|
+
'<h3><a class="custom" style="color: #3f51b5;" rel="nofollow" href="https://apilogicserver.github.io/Docs/" target="_blank">API Logic Server</a> ' +
|
|
7
|
+
'creates <i>customizable</i> model-driven systems, instantly from your ' +
|
|
8
|
+
'database:' +
|
|
9
|
+
'</h3>' +
|
|
10
|
+
'<h4>1. Automatic Admin App</h4>' +
|
|
11
|
+
'<ul>' +
|
|
12
|
+
' <li>For instant collaboration and Back Office data maintenance</li>' +
|
|
13
|
+
' <li>Rich functionality: multi-page, multi-table</li>' +
|
|
14
|
+
' <li>Explore this Admin App, ' +
|
|
15
|
+
' and how to <a class="custom" style="color: #3f51b5" rel="nofollow" href="https://apilogicserver.github.io/Docs/Admin-Customization/" target="_blank">customize it</a></li>' +
|
|
16
|
+
'</ul>' +
|
|
17
|
+
'<h4>2. API, with <a class="custom" style="color: #3f51b5;" rel="nofollow" href="/api" target="_blank">oas/Swagger</a></h4>' +
|
|
18
|
+
'<ul>' +
|
|
19
|
+
' <li>For custom app dev, integration</li>' +
|
|
20
|
+
' <li>Rich functionality: endpoint for each table, with filtering, pagination, related data</li>' +
|
|
21
|
+
' <li><a class="custom" style="color: #3f51b5" rel="nofollow" href="https://apilogicserver.github.io/Docs/API-Customize/" target="_blank">Customizable</a>: add your own endpoints</li>' +
|
|
22
|
+
' <li><a class="custom" style="color: #3f51b5" rel="nofollow" href="http://localhost:5656/stop" target="_blank">Stop</a> the server</li>' +
|
|
23
|
+
'</ul>' +
|
|
24
|
+
'<h4>3. Business Logic, for <span class="JoinedField" title="Often nearly half the app -- automation required"><span>backend processing</span> </span></h4>' +
|
|
25
|
+
'<ul>' +
|
|
26
|
+
' <li>Spreadsheet-like rules for multi-table derivations and constraints</li>' +
|
|
27
|
+
' <li>Extensible with Python events for email, messages, etc</li>' +
|
|
28
|
+
' <li><a class="custom" style="color: #3f51b5" rel="nofollow" href="https://apilogicserver.github.io/Docs/Logic-Why/" target="_blank">Explore</a> ' +
|
|
29
|
+
' how logic can meaningfully improve ' +
|
|
30
|
+
' <a class="custom" style="color: #3f51b5" rel="nofollow" href="https://github.com/valhuber/LogicBank/wiki/by-code" title="Rules are 40X more concise than code, and address over 95% of database logic" target="_blank">conciseness</a> ' +
|
|
31
|
+
' and quality</li>' +
|
|
32
|
+
'</ul>' +
|
|
33
|
+
'<h4>4. MCP-enabled, to <span class="JoinedField" title="Often nearly half the app -- automation required"><span>Enable Bus Users to use Natural Language to create multi-step execution flows</span> </span></h4>'+
|
|
34
|
+
'<ul>' +
|
|
35
|
+
' <li>For more information, <a class="custom" style="color: #3f51b5" rel="nofollow" href="https://apilogicserver.github.io/Docs/Integration-MCP/" target="_blank">Click here</a></li>' +
|
|
36
|
+
' <li>Create a new SysMcp, and enter: List the orders date_shipped is null and CreatedOn before 2023-07-14, and send a discount email (subject: \'Discount Offer\') to the customer for each one.</li>' +
|
|
37
|
+
'</ul>' +
|
|
38
|
+
'</div>'
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
function getContent(){
|
|
42
|
+
|
|
43
|
+
let result = '<button class="MuiButtonBase-root MuiButton-root MuiButton-text makeStyles-widget-159 MuiButton-textPrimary" tabindex="0" type="button" ><span class="MuiButton-label">Loaded External Component. </span></button>';
|
|
44
|
+
result = ""
|
|
45
|
+
result += sla_doc;
|
|
46
|
+
return result;
|
|
47
|
+
}
|
|
48
|
+
|
|
@@ -1,3 +1,15 @@
|
|
|
1
|
+
To issue one request per row from a prior step (fan-out), use the syntax:
|
|
2
|
+
|
|
3
|
+
"$<stepIndex>[*].<fieldName>"
|
|
4
|
+
|
|
5
|
+
For example, if step 0 returns orders, and you want to send a POST per customer:
|
|
6
|
+
|
|
7
|
+
Before (incorrect):
|
|
8
|
+
"customer_id": "{customer_id}"
|
|
9
|
+
|
|
10
|
+
After (correct):
|
|
11
|
+
"customer_id": "$0[*].customer_id"
|
|
12
|
+
|
|
1
13
|
Only if 'email' is in the Natural language query, send email by issing a POST request to the SysEmail endpoint, setting the subject, message and customer_id in the body. DO NOT include a POST unless the word ‘email’ appears in the user query.
|
|
2
14
|
|
|
3
15
|
Format response as mcp_responseFormat.
|
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
api_logic_server_cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
2
|
-
api_logic_server_cli/api_logic_server.py,sha256=
|
|
3
|
-
api_logic_server_cli/api_logic_server_info.yaml,sha256=
|
|
2
|
+
api_logic_server_cli/api_logic_server.py,sha256=sPlwuJ-5alty2QKGWQzrQI-5TanLowp6LlzaCOf3mTs,96233
|
|
3
|
+
api_logic_server_cli/api_logic_server_info.yaml,sha256=7dgxLMqOLurpP0UFLsdB_Xm7EfOjSwmcjr8DJYc3osU,128
|
|
4
4
|
api_logic_server_cli/cli.py,sha256=AT1cWszOygHWIbpxDoXFhaTeSai3Tf5SbGoXvN4h510,83134
|
|
5
5
|
api_logic_server_cli/cli_args_base.py,sha256=lr27KkOB7_WpZwTs7LgiK8LKDIHMKQkoZCTnE99BFxw,3280
|
|
6
6
|
api_logic_server_cli/cli_args_project.py,sha256=I5no_fGRV_ZsK3SuttVDAaQYI4Q5zCjx6LojGkM024w,4645
|
|
7
7
|
api_logic_server_cli/extended_builder.py,sha256=EhtXGAt_RrDR2tCtgvc2U82we7fr-F6pP-e6HS6dQWQ,13867
|
|
8
8
|
api_logic_server_cli/logging.yml,sha256=isWhKviFwJwYgjIUejfhUxcMli2zEbZeQbEvVhNk_4Y,1812
|
|
9
9
|
api_logic_server_cli/manager.py,sha256=pLBJkGYhSFBifW97D162WWqA1UDoIwEXH7A6nBK4j1Y,11048
|
|
10
|
-
api_logic_server_cli/add_cust/add_cust.py,sha256=
|
|
10
|
+
api_logic_server_cli/add_cust/add_cust.py,sha256=ZRmCr62ljocGuiMgplFhpLMFfLJrqsGo7KX0-zKZx-U,14046
|
|
11
11
|
api_logic_server_cli/create_from_model/.DS_Store,sha256=1lFlJ5EFymdzGAUAaI30vcaaLHt3F1LwpG7xILf9jsM,6148
|
|
12
12
|
api_logic_server_cli/create_from_model/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
13
13
|
api_logic_server_cli/create_from_model/api_expose_api_models_creator.py,sha256=V-u3Hm404doztw66YuD2A043RCFmtw5QF5tMioC_1b0,7900
|
|
14
14
|
api_logic_server_cli/create_from_model/api_logic_server_utils.py,sha256=G5ifhuR8OIujUHoklZ-XZyowCpUGKJrkLuyB9sSEf34,26728
|
|
15
15
|
api_logic_server_cli/create_from_model/create_db_from_model.py,sha256=2H7slGnk39XOSnvL7vxrg6Ewx4bxeBJBgLo8fcXHTB4,4382
|
|
16
|
-
api_logic_server_cli/create_from_model/dbml.py,sha256=
|
|
16
|
+
api_logic_server_cli/create_from_model/dbml.py,sha256=UKBIXUDGgm0yk0GefBB6Nu3FDwHf_daYV6qfPM0716U,11557
|
|
17
17
|
api_logic_server_cli/create_from_model/meta_model.py,sha256=ERf7tSgnSJSeRMVyggkdg-lvORQZSbfK0KMpL63qSEY,5837
|
|
18
18
|
api_logic_server_cli/create_from_model/model_creation_services.py,sha256=B86ljgUR98H_dCaxqiw-flrbvc05-XXtkC5It2BSezs,41479
|
|
19
19
|
api_logic_server_cli/create_from_model/ont_build.py,sha256=5BcmM0xW-0vjr9J_u1o0_3joLfKhcLeDWP31dcy5dzI,67028
|
|
@@ -24,7 +24,7 @@ api_logic_server_cli/create_from_model/__pycache__/__init__.cpython-312.pyc,sha2
|
|
|
24
24
|
api_logic_server_cli/create_from_model/__pycache__/api_expose_api_models_creator.cpython-312.pyc,sha256=3wtCiVHOjOgIonZOgnCsF2p01zcXIapx1_Tq2LwzY6Q,6989
|
|
25
25
|
api_logic_server_cli/create_from_model/__pycache__/api_logic_server_utils.cpython-312.pyc,sha256=Qa-lL19TM5dAwMgVmT6ld7iB_Bb7RR0oYpEzlC2UmHM,27403
|
|
26
26
|
api_logic_server_cli/create_from_model/__pycache__/create_db_from_model.cpython-312.pyc,sha256=5eE8pIEa-OoUOk0xn_b78cCc9dSmxjTMn3HGJbxbFY4,4799
|
|
27
|
-
api_logic_server_cli/create_from_model/__pycache__/dbml.cpython-312.pyc,sha256=
|
|
27
|
+
api_logic_server_cli/create_from_model/__pycache__/dbml.cpython-312.pyc,sha256=gJsMCXlkMupUzNYYqecR5sX9prwmZfo3TpzqssSKh3Y,12671
|
|
28
28
|
api_logic_server_cli/create_from_model/__pycache__/meta_model.cpython-312.pyc,sha256=BH5Cflj8YKf0CVkHpIZ_3eBbHXhwIWbwsrzM7DsEikE,7098
|
|
29
29
|
api_logic_server_cli/create_from_model/__pycache__/model_creation_services.cpython-312.pyc,sha256=_pJPTvkJL22Eu1BWM48VfXcyapD366OnXBqHGn-wtO0,36462
|
|
30
30
|
api_logic_server_cli/create_from_model/__pycache__/ont_build.cpython-312.pyc,sha256=Hni6k7GidAkkz-YO2kvmQOMYdCdCWvGWxX3HIPjj1eE,75285
|
|
@@ -478,7 +478,7 @@ api_logic_server_cli/genai/genai.py,sha256=rt4XW_xmo-D5fLD8DQBHMjrU7Teflw43S8lR-
|
|
|
478
478
|
api_logic_server_cli/genai/genai_fatal_excp.py,sha256=1FmDVcXVRqmG0JMVZ7l4KqMOdpff3KGZ2LPAGtw304Q,179
|
|
479
479
|
api_logic_server_cli/genai/genai_graphics.py,sha256=RVLbcHoERS7F2l3WiwKrJkn3VnhQ07A-1ru55IvS4dU,20610
|
|
480
480
|
api_logic_server_cli/genai/genai_logic_builder.py,sha256=u_89UtrALIfcMtW6p0SZ78lCmwRqerA5igyY2hDvjlk,26150
|
|
481
|
-
api_logic_server_cli/genai/genai_svcs.py,sha256=
|
|
481
|
+
api_logic_server_cli/genai/genai_svcs.py,sha256=6qHNj-17S2bkIm8F1nCFGzudLSViTP2WgP_XkAATQf0,48578
|
|
482
482
|
api_logic_server_cli/genai/genai_utils.py,sha256=DTlWTnW5_2pzX4q1VG1tWqoZPVObDHR97SVe0z8Z3rs,17102
|
|
483
483
|
api_logic_server_cli/genai/json2rules.py,sha256=ykoxxgZgqllzt8Ud06S-R_3QtumxXfmF5ksYC0Hh2Sk,2645
|
|
484
484
|
api_logic_server_cli/model_migrator/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -536,7 +536,7 @@ api_logic_server_cli/prototypes/base/api/expose_api_models.py,sha256=XhmZe_8Hnup
|
|
|
536
536
|
api_logic_server_cli/prototypes/base/api/json_encoder.py,sha256=3EFDSi9jdaS4jSOs5EwyltWwTy-8QEoBN2afYknpCdQ,521
|
|
537
537
|
api_logic_server_cli/prototypes/base/api/readme_customize_api.md,sha256=AEeBybDsXSDr2IlqGZCo17ZModZnrflAOCx2a6gP_rE,4165
|
|
538
538
|
api_logic_server_cli/prototypes/base/api/api_discovery/auto_discovery.py,sha256=y6uQ_i9t8qqmjsM69rZzzp2q3OaAbSrwlfeRIrR_sRY,1099
|
|
539
|
-
api_logic_server_cli/prototypes/base/api/api_discovery/mcp_discovery.py,sha256=
|
|
539
|
+
api_logic_server_cli/prototypes/base/api/api_discovery/mcp_discovery.py,sha256=4hXYBCg_3XP2mJ_UJFnxyI7agN_TCUEuOSmf_w29vDw,4088
|
|
540
540
|
api_logic_server_cli/prototypes/base/api/api_discovery/new_service.py,sha256=xe2AAFvpQwjrwwGAXs4pdZ8dWtcqAJ5KKYL_QKyqvGg,638
|
|
541
541
|
api_logic_server_cli/prototypes/base/api/api_discovery/newer_service.py,sha256=p1ah8Pj2kjuTIlktYrtvdiuzGUEaPy7qLa7Cvu0GgbA,659
|
|
542
542
|
api_logic_server_cli/prototypes/base/api/api_discovery/ontimize_api.py,sha256=_gNyxbx6ExbrCy3uzz8JzBBDZRxPyHoyRH7vJRqV1NM,20340
|
|
@@ -553,9 +553,9 @@ api_logic_server_cli/prototypes/base/config/activate_logicbank.py,sha256=IuDe3uW
|
|
|
553
553
|
api_logic_server_cli/prototypes/base/config/config.py,sha256=SMkt_SmMFfQ1g9a9wG0bZNM7yUsRANxFCz2EFWs-WeY,30879
|
|
554
554
|
api_logic_server_cli/prototypes/base/config/default.env,sha256=-rjXJrjR4vjMr9YCVYVchaJw7qMBlbvQ3KfR_wri_XM,412
|
|
555
555
|
api_logic_server_cli/prototypes/base/config/logging-reduced.yml,sha256=N-BDIk0t5uAmw3Of_d_ueK4jx7pxNwlYbkiDd1wjRDs,2179
|
|
556
|
-
api_logic_server_cli/prototypes/base/config/logging.yml,sha256=
|
|
556
|
+
api_logic_server_cli/prototypes/base/config/logging.yml,sha256=Rj7lwLAQ1fiP5al5KZxL8f5CXuICpGJDuJiLJbqcQTE,2426
|
|
557
557
|
api_logic_server_cli/prototypes/base/config/mypy.ini,sha256=2jL3ZtXg9SmJZu6zVQS_hmvO8wyVF1a1JWcVZplXLEk,568
|
|
558
|
-
api_logic_server_cli/prototypes/base/config/server_setup.py,sha256=
|
|
558
|
+
api_logic_server_cli/prototypes/base/config/server_setup.py,sha256=tku0B4O4du554_aVFBXpCgAaEDMaOEVO7cn0spwHpJc,18340
|
|
559
559
|
api_logic_server_cli/prototypes/base/database/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
560
560
|
api_logic_server_cli/prototypes/base/database/alembic.ini,sha256=N-xPrNv1gfMB8ylxm8pprtQxjwlv_9vTUSYGXnaWMnA,3027
|
|
561
561
|
api_logic_server_cli/prototypes/base/database/authentication_db.sqlite,sha256=hA71uBnrh2PVQw9YLc-YbsXjpxr2VyvfE-OhF_ssE6w,45056
|
|
@@ -630,11 +630,13 @@ api_logic_server_cli/prototypes/base/integration/kafka/kafka_consumer.py,sha256=
|
|
|
630
630
|
api_logic_server_cli/prototypes/base/integration/kafka/kafka_producer.py,sha256=g0nMAVfz1Y0iKJbbXfvRpdf-QUmyB4uUGZ6lyaVoXag,4470
|
|
631
631
|
api_logic_server_cli/prototypes/base/integration/kafka/kafka_readme.md,sha256=MlwykHWM2w41KzWh4vPuTnIodR8f-BQzrWpV4P1hrsI,161
|
|
632
632
|
api_logic_server_cli/prototypes/base/integration/mcp/.DS_Store,sha256=1lFlJ5EFymdzGAUAaI30vcaaLHt3F1LwpG7xILf9jsM,6148
|
|
633
|
-
api_logic_server_cli/prototypes/base/integration/mcp/
|
|
634
|
-
api_logic_server_cli/prototypes/base/integration/mcp/mcp_client_executor.py,sha256=Y0kQy4oMuBhCfhZxlfm5qPVXVObjOULatpJ2lIc9qJQ,12926
|
|
635
|
-
api_logic_server_cli/prototypes/base/integration/mcp/mcp_schema.txt,sha256=qmov7e0NdYiQTCxNJU2xzxf9HnYeXFej-c8GSB-y6MM,1143
|
|
633
|
+
api_logic_server_cli/prototypes/base/integration/mcp/mcp_client_executor.py,sha256=w3H6rVgveFg_ZgQNYSb-h1BcLnLF2W45owmWKOMovXg,6559
|
|
636
634
|
api_logic_server_cli/prototypes/base/integration/mcp/mcp_server_discovery.json,sha256=TUyInb67AWoGw7XFE9iDZxmM8UEID-ahQmdmzpF9AmQ,188
|
|
637
|
-
api_logic_server_cli/prototypes/base/integration/mcp/
|
|
635
|
+
api_logic_server_cli/prototypes/base/integration/mcp/examples/mcp_discovery_response.json,sha256=f1RP5kuTU8rkqxWsZoATBF8xdaVEgPTaB4MRoExIF-Q,3763
|
|
636
|
+
api_logic_server_cli/prototypes/base/integration/mcp/examples/mcp_request.prompt,sha256=vmt_fvwOK-C2fnI1LLUMe5WbLk6qxv2RdVJkBUTo9zM,2601
|
|
637
|
+
api_logic_server_cli/prototypes/base/integration/mcp/examples/mcp_schema.txt,sha256=qmov7e0NdYiQTCxNJU2xzxf9HnYeXFej-c8GSB-y6MM,1143
|
|
638
|
+
api_logic_server_cli/prototypes/base/integration/mcp/examples/mcp_tool_context_response.json,sha256=N1bzqc5JMQ7j12ThVuJ-6D8w9ZSmo5c3P0eThd-Q2Mo,1012
|
|
639
|
+
api_logic_server_cli/prototypes/base/integration/mcp/examples/mcp_tool_context_response_get.json,sha256=SDh8CkbL_fRGS7dDwcTofMlPziIu8Ycdests-jAeG6w,419
|
|
638
640
|
api_logic_server_cli/prototypes/base/integration/n8n/N8N_WebHook_from_ApiLogicServer.json,sha256=s9JuoF9gLiuNZAD0dTVdnwQpORQHe0TseyPNVDe048w,10606
|
|
639
641
|
api_logic_server_cli/prototypes/base/integration/n8n/n8n_producer.py,sha256=LuMec7HNwjaCsyMQSTTRpx9tW6l3OiV1StWrnahJBPA,7314
|
|
640
642
|
api_logic_server_cli/prototypes/base/integration/n8n/n8n_readme.md,sha256=8RisYrm8ORUbtu-Duis19DJTBMGW32LymWYZN9A0pF0,3130
|
|
@@ -699,27 +701,19 @@ api_logic_server_cli/prototypes/base/venv_setup/venv.ps1,sha256=_-LfKkLw5HOkZsF5
|
|
|
699
701
|
api_logic_server_cli/prototypes/base/venv_setup/venv.sh,sha256=aWX9fa8fe6aO9ifBIZEgGY5UGh4I0arOoCwBzDsxgU8,893
|
|
700
702
|
api_logic_server_cli/prototypes/basic_demo/README.md,sha256=QHVOtJq7A_9RtTwrrecbbYbdBf3buxkhBgPpX342wAA,18685
|
|
701
703
|
api_logic_server_cli/prototypes/basic_demo/customizations/api/.DS_Store,sha256=6F7pphfwiMhILhl_J6yVhDZFYXmar5V92iLCzSkfnyA,6148
|
|
702
|
-
api_logic_server_cli/prototypes/basic_demo/customizations/api/api_discovery/mcp_discovery.py,sha256=YBgu5EOzrNhhdIPLUN4mplAy5WCy_KodK7LCMZlz6xk,3748
|
|
703
704
|
api_logic_server_cli/prototypes/basic_demo/customizations/api/api_discovery/openapi.py,sha256=kLQ7Fn1J7tzuNJHBXF2AiwtzvQ-0JxJ6z-MfFryAtLk,3887
|
|
704
705
|
api_logic_server_cli/prototypes/basic_demo/customizations/config/default.env,sha256=-rjXJrjR4vjMr9YCVYVchaJw7qMBlbvQ3KfR_wri_XM,412
|
|
705
|
-
api_logic_server_cli/prototypes/basic_demo/customizations/config/server_setup.py,sha256=bV48ou0jSEm2o5yhTVgms1w7rqU9Ccf_2yfZip3ivJk,15441
|
|
706
706
|
api_logic_server_cli/prototypes/basic_demo/customizations/database/db.sqlite,sha256=wfrMPS1h9bq5hT0u901p2FjlGIFZsKZkTy77tzrkzsM,28672
|
|
707
707
|
api_logic_server_cli/prototypes/basic_demo/customizations/database/models.py,sha256=sg-ihsH386778vf2DtW0edzf8oCqDVp1NCqhyWXAbLw,4895
|
|
708
708
|
api_logic_server_cli/prototypes/basic_demo/customizations/database/system/SAFRSBaseX.py,sha256=VeiUgXr9pkgvxchCf89lhRKNBlfj4_FYwAweu3NWj-M,5394
|
|
709
|
-
api_logic_server_cli/prototypes/basic_demo/customizations/integration/mcp/.DS_Store,sha256=1lFlJ5EFymdzGAUAaI30vcaaLHt3F1LwpG7xILf9jsM,6148
|
|
710
|
-
api_logic_server_cli/prototypes/basic_demo/customizations/integration/mcp/README_mcp.md,sha256=ZXLgtvqQCcGouxFE_7pu6OA3Qu1Qm3Jh-gcQxuFKb_w,1216
|
|
711
|
-
api_logic_server_cli/prototypes/basic_demo/customizations/integration/mcp/Zmcp_client_executor.py,sha256=wLjr6RDFpweCMCItno5OGUgNaMDYkYIBtwc7sUqNAG4,12945
|
|
712
|
-
api_logic_server_cli/prototypes/basic_demo/customizations/integration/mcp/mcp_schema.txt,sha256=qmov7e0NdYiQTCxNJU2xzxf9HnYeXFej-c8GSB-y6MM,1143
|
|
713
|
-
api_logic_server_cli/prototypes/basic_demo/customizations/integration/mcp/mcp_server_discovery.json,sha256=TUyInb67AWoGw7XFE9iDZxmM8UEID-ahQmdmzpF9AmQ,188
|
|
714
|
-
api_logic_server_cli/prototypes/basic_demo/customizations/integration/mcp/mcp_tool_context.json,sha256=UB25uyOO5Jnx5k5Sxe7c8MQxc6V0R1FsA4HhpHoKgw4,846
|
|
715
|
-
api_logic_server_cli/prototypes/basic_demo/customizations/integration/mcp/test_notes.txt,sha256=71Qqw7FRVGtEoHCxlGRPpaizvBh1L-X-MTOwkZ6CY3A,11126
|
|
716
709
|
api_logic_server_cli/prototypes/basic_demo/customizations/logic/cocktail-napkin.jpg,sha256=5rNSy6wvcWSHPJQZqkf2DHs19QLWiyqMBNwxGqjstZU,133075
|
|
717
710
|
api_logic_server_cli/prototypes/basic_demo/customizations/logic/declare_logic.py,sha256=Yk-X017gZM1egx4MXSx_FGURj4KDqJfpq1NWVFrwfEY,4612
|
|
718
711
|
api_logic_server_cli/prototypes/basic_demo/customizations/logic/logic_discovery/email_request.py,sha256=3UnBUBpHSThHHRLLJuV-sgRAs6sS-UCzsTjBzf0onns,1851
|
|
719
|
-
api_logic_server_cli/prototypes/basic_demo/customizations/logic/logic_discovery/mcp_client_executor_request.py,sha256=
|
|
712
|
+
api_logic_server_cli/prototypes/basic_demo/customizations/logic/logic_discovery/mcp_client_executor_request.py,sha256=TkruzfnJ53HclWcPTx69du-XsRRAk6O67RsQkCJgUu4,2062
|
|
720
713
|
api_logic_server_cli/prototypes/basic_demo/customizations/logic/logic_discovery/simple_constraints.py,sha256=4HRLOXuLJP1eOosONeEtpA9DehxiZME0-FBKuG1RaI0,760
|
|
721
714
|
api_logic_server_cli/prototypes/basic_demo/customizations/security/declare_security.py,sha256=gbdH29cPY656lgROPm_w20Q-g6AhlIMES3wiIrqBTdk,2439
|
|
722
|
-
api_logic_server_cli/prototypes/basic_demo/customizations/ui/admin/admin.yaml,sha256=
|
|
715
|
+
api_logic_server_cli/prototypes/basic_demo/customizations/ui/admin/admin.yaml,sha256=PynSqW6qUh5JcRJKkgX-aSv8GjmCXxBflBTzRVTa0R0,3503
|
|
716
|
+
api_logic_server_cli/prototypes/basic_demo/customizations/ui/admin/home.js,sha256=0YSOlZAyhYOm7eKSVRMspzEc_P7PO-lRaUurYGCqQ10,3371
|
|
723
717
|
api_logic_server_cli/prototypes/basic_demo/iteration/api/api_discovery/order_b2b.py,sha256=hg9Bsz0_t-RjO9rFcW-YH3y26kq4IY5dd9FfVoYxB4w,3176
|
|
724
718
|
api_logic_server_cli/prototypes/basic_demo/iteration/database/db.sqlite,sha256=QsU34YuKT_YjPF-v6vDtcNJWV6AV2mspqAqW1VoMH5M,28672
|
|
725
719
|
api_logic_server_cli/prototypes/basic_demo/iteration/docs/er_diagram.png,sha256=-3aSv9ay7XeFqGU-cygRz5T5eYhY627BYmA6GXdUYH0,161072
|
|
@@ -5651,7 +5645,7 @@ api_logic_server_cli/prototypes/manager/system/genai/graphics_templates/html_tem
|
|
|
5651
5645
|
api_logic_server_cli/prototypes/manager/system/genai/graphics_templates/index.html,sha256=rTl5u1AtZRIBSxK4aANBRaJK3GZOML6eiVp6Tf_2LkI,567
|
|
5652
5646
|
api_logic_server_cli/prototypes/manager/system/genai/graphics_templates/sales_by_region.jinja,sha256=k93hwOF2KslZEWw31wIobVPdbigsjNUkRWsjec2DdbM,1848
|
|
5653
5647
|
api_logic_server_cli/prototypes/manager/system/genai/learning_requests/logic_bank_api.prompt,sha256=1rBJy-rUHPx9YepSZH9niQocGbxtpbGyX2QmDxVsFd0,14489
|
|
5654
|
-
api_logic_server_cli/prototypes/manager/system/genai/mcp_learning/mcp.prompt,sha256=
|
|
5648
|
+
api_logic_server_cli/prototypes/manager/system/genai/mcp_learning/mcp.prompt,sha256=XWE8K5KcWLgsHa1tdyFv-klbWk7wnzI_TcUZ67jMB84,1291
|
|
5655
5649
|
api_logic_server_cli/prototypes/manager/system/genai/prompt_inserts/fixup.prompt,sha256=ZdVl-0J9oi8dS_3pDTrwdtvMSpDymbArTIlSEwcjCrM,305
|
|
5656
5650
|
api_logic_server_cli/prototypes/manager/system/genai/prompt_inserts/graphics.prompt,sha256=FisvgcF8h2bdOL9iYQHOCT5NmW9RipnHzI6mzin3g8o,1265
|
|
5657
5651
|
api_logic_server_cli/prototypes/manager/system/genai/prompt_inserts/graphics_request.prompt,sha256=T8lILtS_BtOjkalJPpiziVqlHVVc2PV6nz6qikNO808,175
|
|
@@ -6095,9 +6089,9 @@ api_logic_server_cli/tools/mini_skel/database/system/SAFRSBaseX.py,sha256=p8C7AF
|
|
|
6095
6089
|
api_logic_server_cli/tools/mini_skel/database/system/TestDataBase.py,sha256=U02SYqThsbY5g3DX7XGaiMxjZBuOpzvtPS6RfI1WQFg,371
|
|
6096
6090
|
api_logic_server_cli/tools/mini_skel/logic/declare_logic.py,sha256=fTrlHyqMeZsw_TyEXFa1VlYBL7fzjZab5ONSXO7aApo,175
|
|
6097
6091
|
api_logic_server_cli/tools/mini_skel/logic/load_verify_rules.py,sha256=Rr5bySJpYCZmNPF2h-phcPJ53nAOPcT_ohZpCD93-a0,7530
|
|
6098
|
-
apilogicserver-15.0.
|
|
6099
|
-
apilogicserver-15.0.
|
|
6100
|
-
apilogicserver-15.0.
|
|
6101
|
-
apilogicserver-15.0.
|
|
6102
|
-
apilogicserver-15.0.
|
|
6103
|
-
apilogicserver-15.0.
|
|
6092
|
+
apilogicserver-15.0.9.dist-info/licenses/LICENSE,sha256=67BS7VC-Z8GpaR3wijngQJkHWV04qJrwQArVgn9ldoI,1485
|
|
6093
|
+
apilogicserver-15.0.9.dist-info/METADATA,sha256=sDuEWjnABJFeKoHsc_hdv0S_uef_IzdmtONeUzy27mc,6548
|
|
6094
|
+
apilogicserver-15.0.9.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
6095
|
+
apilogicserver-15.0.9.dist-info/entry_points.txt,sha256=KiLloZJ3c_RW-nIDqBtoE0WEsQTnZ3dELwHLWi23LMA,103
|
|
6096
|
+
apilogicserver-15.0.9.dist-info/top_level.txt,sha256=-r0AT_GEApleihg-jIh0OMvzzc0BO1RuhhOpE91H5qI,21
|
|
6097
|
+
apilogicserver-15.0.9.dist-info/RECORD,,
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
Model Context Protocol is a way for:
|
|
2
|
-
|
|
3
|
-
1. **Bus User ad hoc flows** using existing published mcp services (vs. hard-coding in IT as an endpoint; flows can be cached for repeated use)
|
|
4
|
-
|
|
5
|
-
* ***Natural Language access*** to corporate databases for improved user interfaces
|
|
6
|
-
|
|
7
|
-
* LLMs ***choreograph*** multiple MCP calls (to 1 or more MCP servers) in a chain of calls - an agentic workflow. MCPs support shared contexts and goals, enabling the LLM to use the result from 1 call to determine whether the goals has been reached, or which service is appropriate to call next
|
|
8
|
-
|
|
9
|
-
3. Chat agents to ***discover*** and ***call*** external servers, be they databases, APIs, file systems, etc. MCPs support shared contexts and goals, enabling the LLM
|
|
10
|
-
|
|
11
|
-
* ***Corporate database participation*** in such flows, by making key functions available as MCP calls.
|
|
12
|
-
|
|
13
|
-
This example is [explained here](https://apilogicserver.github.io/Docs/Integration-MCP/).
|
|
14
|
-
|
|
15
|
-
> Note: this sample uses multi-term filters. These are usually OR'd together, but this example requires AND. This is provided by `database/system/SAFRSBaseX.py` (see `return query.filter(operator.and_(*expressions)`) in `_s_filter()`), activated in `config/server_setup.py`.
|