@chill-sharp/ui-core 1.1.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/skills/chillsharp-current-user-preferences/SKILL.md +70 -0
- package/.agents/skills/chillsharp-ui-template/SKILL.md +18 -0
- package/README.md +103 -0
- package/chill-sharp-ui-core.d.ts.map +1 -0
- package/doc/AIAssistedDevelopment/README.md +185 -0
- package/doc/AttachmentModel/README.md +173 -0
- package/doc/AuthenticationModel/README.md +213 -0
- package/doc/AuthenticationModel/how-to-integreate-auth-minimal-api.md +293 -0
- package/doc/ChillSharpClient.md +464 -0
- package/doc/ClientGeneration/README.md +172 -0
- package/doc/ComplianceGuide/README.md +178 -0
- package/doc/Configuration/README.md +94 -0
- package/doc/CurrentUserPreferences.md +114 -0
- package/doc/DateTimePolicy/README.md +154 -0
- package/doc/DateTimeSerialization.md +423 -0
- package/doc/Endpoints.md +260 -0
- package/doc/HowTo/01-simple-blog-sqlite.md +153 -0
- package/doc/HowTo/02-blog-schema-labels.md +140 -0
- package/doc/HowTo/03-authentication.md +218 -0
- package/doc/HowTo/04-blog-posts-one-to-many.md +194 -0
- package/doc/HowTo/05-docker-env-variables.md +274 -0
- package/doc/HowTo/06-chunk-transactions-autocomplete.md +196 -0
- package/doc/Mcp/ChatGPT.md +291 -0
- package/doc/Mcp/README.md +799 -0
- package/doc/MenuGuide/README.md +49 -0
- package/doc/ModelPreparation.md +255 -0
- package/doc/PermissionModel/README.md +277 -0
- package/doc/README.md +228 -0
- package/doc/ReferenceExistence.md +130 -0
- package/doc/RegisterContext.md +217 -0
- package/doc/UiCore/CRUD.md +170 -0
- package/doc/UiCore/README.md +13 -0
- package/doc/ValidationModel/README.md +117 -0
- package/doc/it/AIAssistedDevelopment/README.md +185 -0
- package/doc/it/AttachmentModel/README.md +173 -0
- package/doc/it/AuthenticationModel/README.md +171 -0
- package/doc/it/AuthenticationModel/how-to-integreate-auth-minimal-api.md +292 -0
- package/doc/it/ChillSharpClient.md +464 -0
- package/doc/it/ClientGeneration/README.md +152 -0
- package/doc/it/ComplianceGuide/README.md +178 -0
- package/doc/it/Configuration/README.md +94 -0
- package/doc/it/CurrentUserPreferences.md +114 -0
- package/doc/it/DateTimePolicy/README.md +154 -0
- package/doc/it/DateTimeSerialization.md +423 -0
- package/doc/it/Endpoints.md +260 -0
- package/doc/it/HowTo/01-simple-blog-sqlite.md +152 -0
- package/doc/it/HowTo/02-blog-schema-labels.md +139 -0
- package/doc/it/HowTo/03-authentication.md +221 -0
- package/doc/it/HowTo/04-blog-posts-one-to-many.md +193 -0
- package/doc/it/HowTo/05-docker-env-variables.md +268 -0
- package/doc/it/HowTo/06-chunk-transactions-autocomplete.md +196 -0
- package/doc/it/Mcp/ChatGPT.md +291 -0
- package/doc/it/Mcp/README.md +799 -0
- package/doc/it/MenuGuide/README.md +49 -0
- package/doc/it/ModelPreparation.md +254 -0
- package/doc/it/PermissionModel/README.md +190 -0
- package/doc/it/README.md +172 -0
- package/doc/it/ReferenceExistence.md +130 -0
- package/doc/it/RegisterContext.md +218 -0
- package/doc/it/UiCore/CRUD.md +170 -0
- package/doc/it/UiCore/README.md +13 -0
- package/doc/it/ValidationModel/README.md +117 -0
- package/fesm2022/chill-sharp-ui-core.mjs +16725 -0
- package/fesm2022/chill-sharp-ui-core.mjs.map +1 -0
- package/index.d.ts +6 -0
- package/lib/chill-sharp-ui-root.component.d.ts +6 -0
- package/lib/chill-sharp-ui-root.component.d.ts.map +1 -0
- package/lib/chill-sharp-ui.routes.d.ts +3 -0
- package/lib/chill-sharp-ui.routes.d.ts.map +1 -0
- package/lib/chill.config.d.ts +5 -0
- package/lib/chill.config.d.ts.map +1 -0
- package/lib/layouts/auth-shell.component.d.ts +8 -0
- package/lib/layouts/auth-shell.component.d.ts.map +1 -0
- package/lib/layouts/workspace-page.component.d.ts +49 -0
- package/lib/layouts/workspace-page.component.d.ts.map +1 -0
- package/lib/lib/chill-form.component.d.ts +151 -0
- package/lib/lib/chill-form.component.d.ts.map +1 -0
- package/lib/lib/chill-i18n-button-label.component.d.ts +27 -0
- package/lib/lib/chill-i18n-button-label.component.d.ts.map +1 -0
- package/lib/lib/chill-i18n-label.component.d.ts +30 -0
- package/lib/lib/chill-i18n-label.component.d.ts.map +1 -0
- package/lib/lib/chill-json-input.component.d.ts +31 -0
- package/lib/lib/chill-json-input.component.d.ts.map +1 -0
- package/lib/lib/chill-polymorphic-input-controls/chill-polymorphic-boolean-control.component.d.ts +12 -0
- package/lib/lib/chill-polymorphic-input-controls/chill-polymorphic-boolean-control.component.d.ts.map +1 -0
- package/lib/lib/chill-polymorphic-input-controls/chill-polymorphic-editor-control.component.d.ts +17 -0
- package/lib/lib/chill-polymorphic-input-controls/chill-polymorphic-editor-control.component.d.ts.map +1 -0
- package/lib/lib/chill-polymorphic-input-controls/chill-polymorphic-lookup-control.component.d.ts +45 -0
- package/lib/lib/chill-polymorphic-input-controls/chill-polymorphic-lookup-control.component.d.ts.map +1 -0
- package/lib/lib/chill-polymorphic-input-controls/chill-polymorphic-scalar-control.component.d.ts +19 -0
- package/lib/lib/chill-polymorphic-input-controls/chill-polymorphic-scalar-control.component.d.ts.map +1 -0
- package/lib/lib/chill-polymorphic-input-controls/chill-polymorphic-select-control.component.d.ts +12 -0
- package/lib/lib/chill-polymorphic-input-controls/chill-polymorphic-select-control.component.d.ts.map +1 -0
- package/lib/lib/chill-polymorphic-input-controls/chill-polymorphic-textarea-control.component.d.ts +13 -0
- package/lib/lib/chill-polymorphic-input-controls/chill-polymorphic-textarea-control.component.d.ts.map +1 -0
- package/lib/lib/chill-polymorphic-input.component.d.ts +452 -0
- package/lib/lib/chill-polymorphic-input.component.d.ts.map +1 -0
- package/lib/lib/chill-polymorphic-output-controls/chill-polymorphic-output-boolean-control.component.d.ts +7 -0
- package/lib/lib/chill-polymorphic-output-controls/chill-polymorphic-output-boolean-control.component.d.ts.map +1 -0
- package/lib/lib/chill-polymorphic-output-controls/chill-polymorphic-output-lookup-control.component.d.ts +7 -0
- package/lib/lib/chill-polymorphic-output-controls/chill-polymorphic-output-lookup-control.component.d.ts.map +1 -0
- package/lib/lib/chill-polymorphic-output-controls/chill-polymorphic-output-number-control.component.d.ts +7 -0
- package/lib/lib/chill-polymorphic-output-controls/chill-polymorphic-output-number-control.component.d.ts.map +1 -0
- package/lib/lib/chill-polymorphic-output-controls/chill-polymorphic-output-temporal-control.component.d.ts +8 -0
- package/lib/lib/chill-polymorphic-output-controls/chill-polymorphic-output-temporal-control.component.d.ts.map +1 -0
- package/lib/lib/chill-polymorphic-output-controls/chill-polymorphic-output-value-control.component.d.ts +7 -0
- package/lib/lib/chill-polymorphic-output-controls/chill-polymorphic-output-value-control.component.d.ts.map +1 -0
- package/lib/lib/chill-polymorphic-output.component.d.ts +75 -0
- package/lib/lib/chill-polymorphic-output.component.d.ts.map +1 -0
- package/lib/lib/chill-table.component.d.ts +434 -0
- package/lib/lib/chill-table.component.d.ts.map +1 -0
- package/lib/lib/chill-text-editor-dialog.component.d.ts +14 -0
- package/lib/lib/chill-text-editor-dialog.component.d.ts.map +1 -0
- package/lib/lib/crud-configuration.utils.d.ts +4 -0
- package/lib/lib/crud-configuration.utils.d.ts.map +1 -0
- package/lib/lib/culture-name-options.d.ts +3 -0
- package/lib/lib/culture-name-options.d.ts.map +1 -0
- package/lib/lib/date-format-options.d.ts +3 -0
- package/lib/lib/date-format-options.d.ts.map +1 -0
- package/lib/lib/iana-time-zone-options.d.ts +3 -0
- package/lib/lib/iana-time-zone-options.d.ts.map +1 -0
- package/lib/lib/notice-transition.directive.d.ts +17 -0
- package/lib/lib/notice-transition.directive.d.ts.map +1 -0
- package/lib/lib/schema-property-dialog.component.d.ts +74 -0
- package/lib/lib/schema-property-dialog.component.d.ts.map +1 -0
- package/lib/models/chill-auth.models.d.ts +176 -0
- package/lib/models/chill-auth.models.d.ts.map +1 -0
- package/lib/models/chill-menu.models.d.ts +12 -0
- package/lib/models/chill-menu.models.d.ts.map +1 -0
- package/lib/models/chill-schema.models.d.ts +141 -0
- package/lib/models/chill-schema.models.d.ts.map +1 -0
- package/lib/models/workspace-dialog.models.d.ts +16 -0
- package/lib/models/workspace-dialog.models.d.ts.map +1 -0
- package/lib/models/workspace-task.models.d.ts +36 -0
- package/lib/models/workspace-task.models.d.ts.map +1 -0
- package/lib/pages/confirm-reset-page.component.d.ts +21 -0
- package/lib/pages/confirm-reset-page.component.d.ts.map +1 -0
- package/lib/pages/crud/attachment-upload-dialog.component.d.ts +24 -0
- package/lib/pages/crud/attachment-upload-dialog.component.d.ts.map +1 -0
- package/lib/pages/crud/crud-page.component.d.ts +244 -0
- package/lib/pages/crud/crud-page.component.d.ts.map +1 -0
- package/lib/pages/login-page.component.d.ts +21 -0
- package/lib/pages/login-page.component.d.ts.map +1 -0
- package/lib/pages/permissions/auth-role-dialog.component.d.ts +29 -0
- package/lib/pages/permissions/auth-role-dialog.component.d.ts.map +1 -0
- package/lib/pages/permissions/auth-search-select.component.d.ts +28 -0
- package/lib/pages/permissions/auth-search-select.component.d.ts.map +1 -0
- package/lib/pages/permissions/auth-user-dialog.component.d.ts +35 -0
- package/lib/pages/permissions/auth-user-dialog.component.d.ts.map +1 -0
- package/lib/pages/permissions/permission-editor.component.d.ts +55 -0
- package/lib/pages/permissions/permission-editor.component.d.ts.map +1 -0
- package/lib/pages/permissions/permissions-page.component.d.ts +38 -0
- package/lib/pages/permissions/permissions-page.component.d.ts.map +1 -0
- package/lib/pages/permissions/role-permission.component.d.ts +43 -0
- package/lib/pages/permissions/role-permission.component.d.ts.map +1 -0
- package/lib/pages/permissions/user-permission.component.d.ts +43 -0
- package/lib/pages/permissions/user-permission.component.d.ts.map +1 -0
- package/lib/pages/register-page.component.d.ts +24 -0
- package/lib/pages/register-page.component.d.ts.map +1 -0
- package/lib/pages/reset-password-page.component.d.ts +18 -0
- package/lib/pages/reset-password-page.component.d.ts.map +1 -0
- package/lib/provide-chill-sharp-ui-core.d.ts +8 -0
- package/lib/provide-chill-sharp-ui-core.d.ts.map +1 -0
- package/lib/services/chill.service.d.ts +249 -0
- package/lib/services/chill.service.d.ts.map +1 -0
- package/lib/services/workspace-dialog.service.d.ts +22 -0
- package/lib/services/workspace-dialog.service.d.ts.map +1 -0
- package/lib/services/workspace-layout.service.d.ts +13 -0
- package/lib/services/workspace-layout.service.d.ts.map +1 -0
- package/lib/services/workspace-task-registry.service.d.ts +35 -0
- package/lib/services/workspace-task-registry.service.d.ts.map +1 -0
- package/lib/services/workspace-toolbar.service.d.ts +23 -0
- package/lib/services/workspace-toolbar.service.d.ts.map +1 -0
- package/lib/services/workspace.service.d.ts +114 -0
- package/lib/services/workspace.service.d.ts.map +1 -0
- package/lib/storage-keys.d.ts +5 -0
- package/lib/storage-keys.d.ts.map +1 -0
- package/lib/tasks/crud-task/crud-task.component.d.ts +33 -0
- package/lib/tasks/crud-task/crud-task.component.d.ts.map +1 -0
- package/lib/tasks/goto-url-task/goto-url-task.component.d.ts +31 -0
- package/lib/tasks/goto-url-task/goto-url-task.component.d.ts.map +1 -0
- package/lib/workspace/confirm-message-dialog.component.d.ts +16 -0
- package/lib/workspace/confirm-message-dialog.component.d.ts.map +1 -0
- package/lib/workspace/entity-options-dialog.component.d.ts +29 -0
- package/lib/workspace/entity-options-dialog.component.d.ts.map +1 -0
- package/lib/workspace/external-task-api.d.ts +2 -0
- package/lib/workspace/external-task-api.d.ts.map +1 -0
- package/lib/workspace/user-profile-dialog.component.d.ts +30 -0
- package/lib/workspace/user-profile-dialog.component.d.ts.map +1 -0
- package/lib/workspace/workspace-dialog-host.component.d.ts +26 -0
- package/lib/workspace/workspace-dialog-host.component.d.ts.map +1 -0
- package/lib/workspace/workspace-menu-item-dialog.component.d.ts +61 -0
- package/lib/workspace/workspace-menu-item-dialog.component.d.ts.map +1 -0
- package/lib/workspace/workspace-menu.component.d.ts +104 -0
- package/lib/workspace/workspace-menu.component.d.ts.map +1 -0
- package/lib/workspace/workspace-taskbar.component.d.ts +14 -0
- package/lib/workspace/workspace-taskbar.component.d.ts.map +1 -0
- package/package.json +54 -0
- package/public-api.d.ts +56 -0
- package/public-api.d.ts.map +1 -0
- package/service-worker/chill-sharp-service-worker.js +166 -0
- package/styles/core-theme.scss +1268 -0
- package/template-customization/upgrade.ps1.template +342 -0
- package/template-customization/upgrade.sh.template +271 -0
|
@@ -0,0 +1,799 @@
|
|
|
1
|
+
# Modulo MCP ChillSharp
|
|
2
|
+
|
|
3
|
+
Versione originale in inglese: [English](../../Mcp/README.md)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
Questo documento descrive il modulo `ChillSharp.Mcp`, come registrarlo in un host ASP.NET Core e come preparare un `DbContext` e un modello in modo che gli agenti IA possano utilizzare lo schema esposto e la superficie delle query in modo efficiente.
|
|
7
|
+
|
|
8
|
+
`ChillSharp.Mcp` utilizza l'SDK MCP C# ufficiale ed espone un server Model Context Protocol supportato dal contesto ChillSharp.
|
|
9
|
+
|
|
10
|
+
Per una guida mirata sulla connessione di questo server MCP da ChatGPT, vedere [HOW-TO: connettere ChillSharp MCP a ChatGPT](ChatGPT.md).
|
|
11
|
+
|
|
12
|
+
## Obiettivi
|
|
13
|
+
|
|
14
|
+
Dopo la configurazione, un client MCP può:
|
|
15
|
+
|
|
16
|
+
- scoprire gli schemi abilitati per MCP esposti dal tuo host
|
|
17
|
+
- ispezionare l'entità completa e gli schemi di query prima di inviare richieste
|
|
18
|
+
- leggere le descrizioni MCP a livello di schema e di proprietà
|
|
19
|
+
- esegui solo le query che esponi esplicitamente tramite `EnableMCP`
|
|
20
|
+
- eseguire operazioni DTO come ricerca, ricerca, creazione, aggiornamento, eliminazione, completamento automatico, convalida e blocco
|
|
21
|
+
- operare con autorizzazioni utente autenticate dal portatore e limitazioni della chiave API
|
|
22
|
+
|
|
23
|
+
## Strumenti registrati
|
|
24
|
+
|
|
25
|
+
Il modulo registra questi strumenti MCP:
|
|
26
|
+
|
|
27
|
+
-
|
|
28
|
+
-
|
|
29
|
+
-
|
|
30
|
+
-
|
|
31
|
+
-
|
|
32
|
+
-
|
|
33
|
+
-
|
|
34
|
+
-
|
|
35
|
+
-
|
|
36
|
+
-
|
|
37
|
+
-
|
|
38
|
+
-
|
|
39
|
+
-
|
|
40
|
+
|
|
41
|
+
### `ChillSharp get-schema-list`
|
|
42
|
+
|
|
43
|
+
Restituisce solo gli schemi abilitati per MCP.
|
|
44
|
+
|
|
45
|
+
Utilizzalo come punto di ingresso per il rilevamento. Indica all'IA quali entità e query devono essere utilizzate tramite MCP.
|
|
46
|
+
|
|
47
|
+
### `ChillSharp get-schema`
|
|
48
|
+
|
|
49
|
+
Restituisce l'intero `ChillDtoSchema` per un'entità o un tipo di query abilitato per MCP.
|
|
50
|
+
|
|
51
|
+
Questo è lo strumento di introspezione più importante. Include:
|
|
52
|
+
|
|
53
|
+
- metadati dello schema
|
|
54
|
+
- informazioni sul tipo correlato alla query
|
|
55
|
+
- metadati di relazione dedotti da raccolte annotate con `ChillRelationAttribute`
|
|
56
|
+
- `MCPDescription` a livello di schema
|
|
57
|
+
- tutte le proprietà dello schema
|
|
58
|
+
- `MCPDescription` a livello di proprietà per ogni proprietà
|
|
59
|
+
- informazioni sul tipo di riferimento
|
|
60
|
+
- `simplePropertyType`, una stringa di tipo agent-friendly per la costruzione del carico utile
|
|
61
|
+
|
|
62
|
+
In pratica, ecco come apprende un’intelligenza artificiale:
|
|
63
|
+
|
|
64
|
+
- cosa rappresenta l'oggetto
|
|
65
|
+
- cosa significa ciascuna proprietà
|
|
66
|
+
- quale query restituisce quale tipo di entità
|
|
67
|
+
- quali proprietà sono riferimenti ad altri tipi di Chill
|
|
68
|
+
- quale forma di valore richiede ciascuna proprietà della richiesta
|
|
69
|
+
|
|
70
|
+
Gli agenti non dovrebbero inventare oggetti di richiesta. Utilizza `get-schema` come contratto, copia i nomi esatti delle proprietà dallo schema e invia valori che corrispondono a `simplePropertyType` di ciascuna proprietà.
|
|
71
|
+
|
|
72
|
+
Per gli schemi di entità, `Relations` descrive le raccolte di relazioni figlio che l'interfaccia utente può collegare automaticamente in fase di esecuzione. Ogni voce di relazione include:
|
|
73
|
+
|
|
74
|
+
- `ChillType`, il tipo di entità figlio o di relazione esposto dalla raccolta
|
|
75
|
+
- `ChillQuery`, il tipo di query da utilizzare per la ricerca secondaria filtrata quando è possibile risolverla
|
|
76
|
+
- `FixedValues`, valori predefiniti da inserire durante la creazione di un'entità figlio
|
|
77
|
+
- `FixedQueryValues`, filtri di query predefiniti da applicare durante la navigazione di entità correlate esistenti
|
|
78
|
+
- `RelationLabel`, l'etichetta GUID e i testi predefiniti derivati da `ChillRelationAttribute` della raccolta
|
|
79
|
+
|
|
80
|
+
Quando una relazione può essere ricollegata al genitore corrente tramite un riferimento figlio annotato, ChillSharp emette il valore magico `@{mock}` all'interno di `FixedValues` e `FixedQueryValues`. I client dell'interfaccia utente sostituiscono quel token con l'entità principale corrente per il nome della proprietà FK/riferimento corrispondente.
|
|
81
|
+
|
|
82
|
+
I valori `simplePropertyType` comuni sono:
|
|
83
|
+
|
|
84
|
+
| tipoPropertysemplice | Valore del carico utile |
|
|
85
|
+
| --- | --- |
|
|
86
|
+
| | Stringa GUID |
|
|
87
|
+
| | Numero JSON senza decimali |
|
|
88
|
+
| | Numero JSON |
|
|
89
|
+
| | stringa della data |
|
|
90
|
+
| | stringa temporale |
|
|
91
|
+
| | stringa data-ora |
|
|
92
|
+
| | stringa di durata o valore numerico accettato dall'host |
|
|
93
|
+
| | JSON booleano |
|
|
94
|
+
| , | Stringa JSON |
|
|
95
|
+
| | Oggetto JSON, array o stringa JSON in base al contratto di campo |
|
|
96
|
+
| | Riferimento `ChillDtoEntity` con `ChillType` e `Guid` |
|
|
97
|
+
| | array di riferimenti `ChillDtoEntity` |
|
|
98
|
+
| | query DTO corrispondente allo schema di query a cui si fa riferimento |
|
|
99
|
+
|
|
100
|
+
### `ChillSharp query`
|
|
101
|
+
|
|
102
|
+
Esegue una query ChillSharp solo quando la relativa entità restituita è abilitata per MCP.
|
|
103
|
+
|
|
104
|
+
Il flusso di lavoro consigliato è:
|
|
105
|
+
|
|
106
|
+
1. chiamare `ChillSharp get-schema-list`
|
|
107
|
+
2. chiamare `ChillSharp get-schema` sul tipo di query selezionato
|
|
108
|
+
3. leggere descrizioni, proprietà e tipo restituito
|
|
109
|
+
4. invia un payload `ChillDtoQuery` a `ChillSharp query`
|
|
110
|
+
|
|
111
|
+
L'oggetto `Properties` deve contenere solo nomi di proprietà di input accettati dallo schema di query. Per ogni valore, seguire `simplePropertyType`; ad esempio, inviare una stringa per `string`, un numero per `int` o `decimal` e un riferimento `ChillDtoEntity` per `chill-entity`.
|
|
112
|
+
|
|
113
|
+
Leggere `MCPDescription` di ciascuna proprietà della query per dedurre come viene eseguita la ricerca dell'input. Le descrizioni dovrebbero indicare all'agente se una proprietà si comporta come un valore esatto, contiene una ricerca di testo in stile, un limite di intervallo, un riferimento di ricerca, un selettore di stato o un'altra regola di query personalizzata. Se la descrizione manca o non specifica il comportamento di corrispondenza, presuppone che la corrispondenza esatta sia uguale.
|
|
114
|
+
|
|
115
|
+
Ogni query Chill supporta anche `Properties.FullTextSearch`. Utilizzalo per la ricerca di parole chiave generiche nell'obiettivo della query quando l'utente non richiede un filtro strutturato specifico.
|
|
116
|
+
|
|
117
|
+
`FullTextSearch` cerca l'entità `FullTextContent` generata da ChillSharp. Il testo senza virgolette senza selettori avanzati è normalizzato, suddiviso in spazi bianchi e abbinato a AND, quindi ogni token deve essere presente. Le parentesi più gli operatori `and`/`or` autonomi al di fuori delle virgolette consentono la ricerca booleana raggruppata. Cerca le parole letterali `and` o `or` racchiudendole tra virgolette corrispondenti. Il testo racchiuso tra virgolette singole o doppie corrispondenti viene cercato come una frase normalizzata con limiti di parole:
|
|
118
|
+
|
|
119
|
+
| Cerca testo | Significato |
|
|
120
|
+
| --- | --- |
|
|
121
|
+
| | Abbina i record contenenti sia `la` che `nazione` come token, in qualsiasi posizione. |
|
|
122
|
+
| | Abbina record contenenti sia `la` che `nazione` oppure record contenenti `roma`. |
|
|
123
|
+
| | Cerca la parola chiave letterale `and` anziché l'operatore booleano. |
|
|
124
|
+
| | Abbina la frase esatta come parole intere, ad esempio `bla bla la nazione bla bla`, ma non `bla bla della nazione bla bla`. |
|
|
125
|
+
| `"*la nazione"` o `"%la nazione"` | Rilassa il confine sinistro, in modo che `della nazione` possa corrispondere. |
|
|
126
|
+
| `"la nazione*"` o `"la nazione%"` | Rilassa il confine destro, in modo che un suffisso possa corrispondere. |
|
|
127
|
+
| `"la*nazione"` o `"la%nazione"` | Tratta il carattere jolly centrale come un separatore di token e applica la normale corrispondenza dei token AND. |
|
|
128
|
+
|
|
129
|
+
### `ChillSharp lookup`
|
|
130
|
+
|
|
131
|
+
Esegue una ricerca generica di testo completo rispetto a uno schema di entità abilitato per MCP.
|
|
132
|
+
|
|
133
|
+
Utilizza un payload `ChillDtoQuery` con:
|
|
134
|
+
|
|
135
|
+
- `ChillType` impostato su un tipo di entità come `Model.Blog`
|
|
136
|
+
- `Properties.FullTextSearch` contenente il testo della ricerca
|
|
137
|
+
- `ResultProperties`, `Pagination` e `Ordering` opzionali
|
|
138
|
+
|
|
139
|
+
`Properties.FullTextSearch` utilizza la stessa frase tra virgolette e le stesse regole dei caratteri jolly descritte in `ChillSharp query`.
|
|
140
|
+
|
|
141
|
+
### `ChillSharp find`
|
|
142
|
+
|
|
143
|
+
Trova un'entità abilitata per MCP in base a `ChillType` e `Guid`.
|
|
144
|
+
|
|
145
|
+
Utilizza un payload `ChillDtoEntity` con:
|
|
146
|
+
|
|
147
|
+
- `ChillType` impostato su un tipo di entità come `Model.Blog`
|
|
148
|
+
- `Guid` impostato sull'identificatore del record
|
|
149
|
+
|
|
150
|
+
Lo strumento restituisce `null` quando non esiste alcun record corrispondente.
|
|
151
|
+
|
|
152
|
+
### `ChillSharp create`
|
|
153
|
+
|
|
154
|
+
Crea una nuova entità abilitata per MCP e restituisce il valore `ChillDtoEntity` persistente.
|
|
155
|
+
|
|
156
|
+
Utilizza prima `ChillSharp get-schema`, quindi invia un payload `ChillDtoEntity` con:
|
|
157
|
+
|
|
158
|
+
- `ChillType` impostato su un tipo di entità come `Model.Blog`
|
|
159
|
+
- facoltativo `Guid` quando il client sceglie l'identificatore
|
|
160
|
+
- `Properties` contenente valori di campo annotati
|
|
161
|
+
|
|
162
|
+
### `ChillSharp update`
|
|
163
|
+
|
|
164
|
+
Aggiorna un'entità esistente abilitata per MCP e restituisce l'oggetto `ChillDtoEntity` aggiornato.
|
|
165
|
+
|
|
166
|
+
Utilizza un payload `ChillDtoEntity` con:
|
|
167
|
+
|
|
168
|
+
- `ChillType` impostato su un tipo di entità come `Model.Blog`
|
|
169
|
+
- `Guid` impostato su un record esistente
|
|
170
|
+
- `Properties` contenente i campi da aggiornare
|
|
171
|
+
|
|
172
|
+
### `ChillSharp delete`
|
|
173
|
+
|
|
174
|
+
Elimina un'entità esistente abilitata per MCP identificata da `ChillType` e `Guid`.
|
|
175
|
+
|
|
176
|
+
Questa è un'operazione mutante. Un client dovrebbe normalmente chiamare prima `ChillSharp find` per confermare il record esatto prima della cancellazione.
|
|
177
|
+
|
|
178
|
+
### `ChillSharp autocomplete-entity`
|
|
179
|
+
|
|
180
|
+
Applica la logica di completamento automatico dell'entità ChillSharp senza modifiche persistenti.
|
|
181
|
+
|
|
182
|
+
Utilizzalo prima di `create` o `update` quando il modello di entità calcola etichette, URL, riferimenti o altri valori derivati.
|
|
183
|
+
|
|
184
|
+
### `ChillSharp autocomplete-query`
|
|
185
|
+
|
|
186
|
+
Applica la logica di completamento automatico delle query ChillSharp senza eseguire la query.
|
|
187
|
+
|
|
188
|
+
Utilizzarlo quando gli input della query hanno valori dipendenti o calcolati.
|
|
189
|
+
|
|
190
|
+
### `ChillSharp validate-entity`
|
|
191
|
+
|
|
192
|
+
Convalida un DTO di entità abilitato per MCP e restituisce errori di convalida di ChillSharp senza modifiche persistenti.
|
|
193
|
+
|
|
194
|
+
Utilizzarlo prima di `create` o `update` quando il modello host espone regole di convalida.
|
|
195
|
+
|
|
196
|
+
### `ChillSharp validate-query`
|
|
197
|
+
|
|
198
|
+
Convalida un DTO di query abilitato per MCP e restituisce errori di convalida di ChillSharp senza eseguire la query.
|
|
199
|
+
|
|
200
|
+
Utilizzarlo prima di `query` quando il tipo di query espone regole di convalida.
|
|
201
|
+
|
|
202
|
+
### `ChillSharp chunk`
|
|
203
|
+
|
|
204
|
+
Esegue un elenco di elementi `ChillOperation` e restituisce l'elenco delle operazioni aggiornato.
|
|
205
|
+
|
|
206
|
+
I verbi supportati sono:
|
|
207
|
+
|
|
208
|
+
-
|
|
209
|
+
-
|
|
210
|
+
-
|
|
211
|
+
-
|
|
212
|
+
-
|
|
213
|
+
-
|
|
214
|
+
-
|
|
215
|
+
-
|
|
216
|
+
-
|
|
217
|
+
|
|
218
|
+
Ogni operazione viene controllata per la visibilità MCP prima dell'esecuzione di qualsiasi operazione. Se un'operazione prende di mira uno schema non abilitato per MCP, l'intero blocco viene rifiutato.
|
|
219
|
+
|
|
220
|
+
Per le operazioni `query`, `autocomplete` e `validate` che utilizzano un payload di query, impostare `Query`. Per le operazioni sulle entità, impostare `Entity`.
|
|
221
|
+
|
|
222
|
+
## Configurazione di base dell'host
|
|
223
|
+
|
|
224
|
+
```csharp
|
|
225
|
+
using ChillSharp.Api;
|
|
226
|
+
using Microsoft.EntityFrameworkCore;
|
|
227
|
+
|
|
228
|
+
var builder = WebApplication.CreateBuilder(args);
|
|
229
|
+
|
|
230
|
+
builder.Services.AddDbContext<AppDbContext>(options =>
|
|
231
|
+
options.UseSqlite("Data Source=app.db"));
|
|
232
|
+
|
|
233
|
+
builder.Services.AddChillApi<AppDbContext>(options =>
|
|
234
|
+
{
|
|
235
|
+
options.ProtectedApi = true;
|
|
236
|
+
});
|
|
237
|
+
|
|
238
|
+
var app = builder.Build();
|
|
239
|
+
|
|
240
|
+
app.UseAuthentication();
|
|
241
|
+
app.UseAuthorization();
|
|
242
|
+
app.MapChillApi();
|
|
243
|
+
app.Run();
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
Quando `EnableMcpApi` rimane `true`, il modulo MCP è abilitato per impostazione predefinita come parte di `AddChillApi<TContext>()`.
|
|
247
|
+
|
|
248
|
+
## URL di connessione dell'agente
|
|
249
|
+
|
|
250
|
+
Gli agenti e i client MCP si connettono all'endpoint di trasporto HTTP MCP, non ai normali endpoint REST di ChillSharp.
|
|
251
|
+
|
|
252
|
+
Con la configurazione predefinita, utilizzare:
|
|
253
|
+
|
|
254
|
+
```text
|
|
255
|
+
{host}/api/chill-mcp
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
Esempi locali:
|
|
259
|
+
|
|
260
|
+
```text
|
|
261
|
+
http://localhost:5000/api/chill-mcp
|
|
262
|
+
https://localhost:5001/api/chill-mcp
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
Non configurare gli agenti per utilizzare `/api/chill`, `/api/chill/query` o l'URL Swagger. Questi sono normali endpoint API REST. Per impostazione predefinita, l'endpoint SDK MCP è `/api/chill-mcp`.
|
|
266
|
+
|
|
267
|
+
L'URL finale si basa su due impostazioni:
|
|
268
|
+
|
|
269
|
+
- `ChillApiOptions.ApiBasePath`, predefinito `/api`
|
|
270
|
+
- `ChillMcpOptions.RoutePattern`, predefinito `/api/chill-mcp`
|
|
271
|
+
|
|
272
|
+
La route MCP predefinita è normalizzata al percorso base API corrente. Ciò significa:
|
|
273
|
+
|
|
274
|
+
| Percorso base API | Percorso MCP da utilizzare |
|
|
275
|
+
| --- | --- |
|
|
276
|
+
| | |
|
|
277
|
+
| | |
|
|
278
|
+
| percorso base vuoto | |
|
|
279
|
+
|
|
280
|
+
Se configuri un percorso MCP personalizzato:
|
|
281
|
+
|
|
282
|
+
```csharp
|
|
283
|
+
builder.Services.AddChillMcpApi<AppDbContext>(options =>
|
|
284
|
+
{
|
|
285
|
+
options.RoutePattern = "mcp";
|
|
286
|
+
});
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
quindi il percorso è relativo al percorso base dell'API ChillSharp, quindi il percorso base dell'API predefinito produce:
|
|
290
|
+
|
|
291
|
+
```text
|
|
292
|
+
{host}/api/mcp
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
Se configuri un percorso assoluto:
|
|
296
|
+
|
|
297
|
+
```csharp
|
|
298
|
+
builder.Services.AddChillMcpApi<AppDbContext>(options =>
|
|
299
|
+
{
|
|
300
|
+
options.RoutePattern = "/mcp";
|
|
301
|
+
});
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
quindi gli agenti dovrebbero connettersi a:
|
|
305
|
+
|
|
306
|
+
```text
|
|
307
|
+
{host}/mcp
|
|
308
|
+
```
|
|
309
|
+
|
|
310
|
+
Quando `ProtectedApi = true`, l'endpoint MCP richiede l'autenticazione. Configura l'agente o il client MCP per inviare:
|
|
311
|
+
|
|
312
|
+
```http
|
|
313
|
+
Authorization: Bearer <access-token>
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
## Disabilita MCP a livello globale
|
|
317
|
+
|
|
318
|
+
```csharp
|
|
319
|
+
builder.Services.AddChillApi<AppDbContext>(options =>
|
|
320
|
+
{
|
|
321
|
+
options.EnableMcpApi = false;
|
|
322
|
+
});
|
|
323
|
+
```
|
|
324
|
+
|
|
325
|
+
## Registra direttamente il modulo
|
|
326
|
+
|
|
327
|
+
Se hai bisogno della registrazione diretta del modulo:
|
|
328
|
+
|
|
329
|
+
```csharp
|
|
330
|
+
using ChillSharp.Mcp.Api;
|
|
331
|
+
|
|
332
|
+
builder.Services.AddChillMcpApi<AppDbContext>(options =>
|
|
333
|
+
{
|
|
334
|
+
options.Enabled = true;
|
|
335
|
+
options.RoutePattern = "/api/chill-mcp";
|
|
336
|
+
});
|
|
337
|
+
```
|
|
338
|
+
|
|
339
|
+
## Requisiti del contesto
|
|
340
|
+
|
|
341
|
+
Il contesto host deve:
|
|
342
|
+
|
|
343
|
+
- eredita da `DbContext`
|
|
344
|
+
- implementare `IChillContext`
|
|
345
|
+
- implementare `IChillSchemaDbContext`
|
|
346
|
+
- includere il modello di schema Chill in `OnModelCreating`
|
|
347
|
+
|
|
348
|
+
Forma tipica:
|
|
349
|
+
|
|
350
|
+
```csharp
|
|
351
|
+
using ChillSharp;
|
|
352
|
+
using ChillSharp.Schema;
|
|
353
|
+
using Microsoft.EntityFrameworkCore;
|
|
354
|
+
|
|
355
|
+
public class AppDbContext : DbContext, IChillContext, IChillSchemaDbContext
|
|
356
|
+
{
|
|
357
|
+
public AppDbContext(DbContextOptions<AppDbContext> options) : base(options) { }
|
|
358
|
+
|
|
359
|
+
public string GetChillTypePrefix()
|
|
360
|
+
{
|
|
361
|
+
return "MyCompany.MyProduct.Data";
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
public string GetPrimaryCultureName()
|
|
365
|
+
{
|
|
366
|
+
return "en-US";
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
public string GetSecondaryCultureName()
|
|
370
|
+
{
|
|
371
|
+
return "it-IT";
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
public string GetCurrentUserName()
|
|
375
|
+
{
|
|
376
|
+
return Environment.UserName;
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
protected override void OnModelCreating(ModelBuilder modelBuilder)
|
|
380
|
+
{
|
|
381
|
+
base.OnModelCreating(modelBuilder);
|
|
382
|
+
modelBuilder.AddChillSchemaModel();
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
```
|
|
386
|
+
|
|
387
|
+
## Autenticazione
|
|
388
|
+
|
|
389
|
+
L'endpoint MCP è pensato per essere eseguito dietro l'autenticazione della portante.
|
|
390
|
+
|
|
391
|
+
Se l'host utilizza:
|
|
392
|
+
|
|
393
|
+
```csharp
|
|
394
|
+
builder.Services.AddChillApi<AppDbContext>(options =>
|
|
395
|
+
{
|
|
396
|
+
options.ProtectedApi = true;
|
|
397
|
+
});
|
|
398
|
+
```
|
|
399
|
+
|
|
400
|
+
quindi anche l'endpoint MCP mappato richiede l'autenticazione.
|
|
401
|
+
|
|
402
|
+
Questo è importante perché l'esposizione MCP dovrebbe in genere essere limitata a un utente o a una chiave API, non a chiamanti anonimi.
|
|
403
|
+
|
|
404
|
+
## Connessione ChatGPT OAuth
|
|
405
|
+
|
|
406
|
+
Quando connetti ChatGPT a un server MCP remoto protetto, configura ChatGPT con l'endpoint MCP HTTPS pubblico:
|
|
407
|
+
|
|
408
|
+
```text
|
|
409
|
+
https://your-domain.example/api/chill-mcp
|
|
410
|
+
```
|
|
411
|
+
|
|
412
|
+
Se si usa il modulo di autenticazione ChillSharp supportato da ASP.NET Core Identity, ChillSharp espone un flusso di codice di autorizzazione OAuth incorporato con PKCE per ChatGPT e altri client MCP remoti.
|
|
413
|
+
|
|
414
|
+
Gli endpoint OAuth predefiniti sono:
|
|
415
|
+
|
|
416
|
+
| Scopo | URL |
|
|
417
|
+
| --- | --- |
|
|
418
|
+
| Metadati del server di autorizzazione OAuth | |
|
|
419
|
+
| Metadati delle risorse protette MCP | |
|
|
420
|
+
| Registrazione dinamica del cliente | |
|
|
421
|
+
| Autorizzazione e consenso dell'utente | |
|
|
422
|
+
| Scambio gettoni | |
|
|
423
|
+
|
|
424
|
+
Il flusso è:
|
|
425
|
+
|
|
426
|
+
1. ChatGPT rileva i metadati delle risorse protette e del server di autorizzazione.
|
|
427
|
+
2. ChatGPT si registra dinamicamente come client OAuth pubblico.
|
|
428
|
+
3. L'utente viene reindirizzato alla pagina di autorizzazione di ChillSharp.
|
|
429
|
+
4. L'utente accede con l'account identità ASP.NET Core.
|
|
430
|
+
5. ChillSharp reindirizza ChatGPT con un codice di autorizzazione.
|
|
431
|
+
6. ChatGPT scambia il codice e il verificatore PKCE con un token di accesso al portatore ChillSharp.
|
|
432
|
+
7. ChatGPT chiama l'endpoint MCP con:
|
|
433
|
+
|
|
434
|
+
```http
|
|
435
|
+
Authorization: Bearer <access-token>
|
|
436
|
+
```
|
|
437
|
+
|
|
438
|
+
Pertanto OAuth viene utilizzato per il consenso dell'utente e l'acquisizione di token. Il server MCP stesso convalida comunque il token di connessione risultante tramite il normale gestore di autenticazione della connessione di ChillSharp.
|
|
439
|
+
|
|
440
|
+
Configurazione protetta tipica:
|
|
441
|
+
|
|
442
|
+
```csharp
|
|
443
|
+
builder.Services.AddIdentityCore<IdentityUser>()
|
|
444
|
+
.AddEntityFrameworkStores<AppDbContext>()
|
|
445
|
+
.AddSignInManager()
|
|
446
|
+
.AddDefaultTokenProviders();
|
|
447
|
+
|
|
448
|
+
builder.Services.AddAuthentication(ChillAuthIdentityDefaults.AuthenticationScheme)
|
|
449
|
+
.AddChillAuthBearer();
|
|
450
|
+
|
|
451
|
+
builder.Services.AddAuthorization();
|
|
452
|
+
|
|
453
|
+
builder.Services.AddChillApi<AppDbContext, IdentityUser>(options =>
|
|
454
|
+
{
|
|
455
|
+
options.ProtectedApi = true;
|
|
456
|
+
});
|
|
457
|
+
```
|
|
458
|
+
|
|
459
|
+
Gli endpoint OAuth sono abilitati per impostazione predefinita per il modulo di autenticazione supportata da identità. Puoi configurarli tramite `ChillIdentityApiOptions`:
|
|
460
|
+
|
|
461
|
+
```csharp
|
|
462
|
+
builder.Services.AddChillApi<AppDbContext, IdentityUser>(options =>
|
|
463
|
+
{
|
|
464
|
+
options.ProtectedApi = true;
|
|
465
|
+
options.OAuthBasePath = "/api/chill-auth/oauth";
|
|
466
|
+
options.OAuthProtectedResourcePath = "/api/chill-mcp";
|
|
467
|
+
options.OAuthAuthorizationCodeLifetime = TimeSpan.FromMinutes(5);
|
|
468
|
+
});
|
|
469
|
+
```
|
|
470
|
+
|
|
471
|
+
Se disabiliti o sostituisci gli endpoint OAuth integrati, puoi comunque utilizzare ChillSharp come server di risorse MCP purché il tuo gestore di autenticazione convalidi il token di connessione finale e ChatGPT possa completare un flusso di codice di autorizzazione OAuth altrove.
|
|
472
|
+
|
|
473
|
+
## Come funziona `EnableMCP`
|
|
474
|
+
|
|
475
|
+
Gli strumenti MCP espongono solo schemi la cui visibilità MCP è abilitata.
|
|
476
|
+
|
|
477
|
+
Uno schema è considerato abilitato per MCP quando:
|
|
478
|
+
|
|
479
|
+
- `schema.EnableMCP` è `true`
|
|
480
|
+
- Le opzioni dell'entità runtime abilitano MCP per quel tipo di Chill
|
|
481
|
+
|
|
482
|
+
Per gli schemi di query, la visibilità MCP è controllata dalla relativa entità restituita. Una query che restituisce `Model.Invoice` è visibile ed eseguibile tramite MCP solo quando `Model.Invoice` è abilitato per MCP. Abilitando solo il tipo di query non viene pubblicata un'entità nascosta.
|
|
483
|
+
|
|
484
|
+
Ciò significa:
|
|
485
|
+
|
|
486
|
+
- `get-schema-list` mostra solo gli schemi abilitati
|
|
487
|
+
- `get-schema` restituisce solo gli schemi abilitati
|
|
488
|
+
- `query` esegue solo le query la cui relativa entità restituita è abilitata
|
|
489
|
+
- Gli strumenti di entità operano solo su schemi di entità abilitati
|
|
490
|
+
- `chunk` controlla ogni query o entità mirata prima di eseguire il batch
|
|
491
|
+
|
|
492
|
+
Ciò fornisce un meccanismo esplicito di pubblicazione/annullamento della pubblicazione per le funzionalità del database rivolte all'intelligenza artificiale.
|
|
493
|
+
|
|
494
|
+
## Preparazione di un contesto Db per un consumo efficiente dell'intelligenza artificiale
|
|
495
|
+
|
|
496
|
+
Questa è la parte più importante del modulo.
|
|
497
|
+
|
|
498
|
+
Un'intelligenza artificiale non capisce il tuo modello come fa un compagno di squadra umano. Dipende fortemente dai metadati, dalla denominazione, dalle descrizioni e da una superficie di query vincolata. Un database può essere tecnicamente esposto tramite MCP ed essere comunque difficile da utilizzare bene per un'intelligenza artificiale.
|
|
499
|
+
|
|
500
|
+
Se vuoi che un'intelligenza artificiale utilizzi un host ChillSharp in modo efficiente, prepara il modello intenzionalmente.
|
|
501
|
+
|
|
502
|
+
## 1. Utilizzare nomi chiari per i tipi di Chill
|
|
503
|
+
|
|
504
|
+
Nomi di tipo breve come `Model.Blog`, `Model.Invoice` e `Query.PostSearchQuery` sono più facili da ragionare per un'intelligenza artificiale rispetto ai nomi opachi.
|
|
505
|
+
|
|
506
|
+
Preferisco:
|
|
507
|
+
|
|
508
|
+
-
|
|
509
|
+
-
|
|
510
|
+
-
|
|
511
|
+
-
|
|
512
|
+
|
|
513
|
+
Evita nomi che richiedono la conoscenza del team interno per essere decodificati.
|
|
514
|
+
|
|
515
|
+
Meno efficiente:
|
|
516
|
+
|
|
517
|
+
-
|
|
518
|
+
-
|
|
519
|
+
-
|
|
520
|
+
|
|
521
|
+
## 2. Annota intenzionalmente ogni proprietà esposta
|
|
522
|
+
|
|
523
|
+
Utilizza `[ChillProperty]` in modo coerente sulle proprietà che desideri nella superficie rivolta all'intelligenza artificiale.
|
|
524
|
+
|
|
525
|
+
Ciò influisce:
|
|
526
|
+
|
|
527
|
+
- generazione dello schema
|
|
528
|
+
- interrogare le aspettative di carico utile
|
|
529
|
+
- Mappatura DTO
|
|
530
|
+
- l'elenco dei campi che un'intelligenza artificiale vede quando ispeziona uno schema
|
|
531
|
+
|
|
532
|
+
Se una proprietà è importante per query, ricerche, filtri o risultati, in genere dovrebbe essere annotata esplicitamente.
|
|
533
|
+
|
|
534
|
+
## 3. Scrivi un testo `MCPDescription` efficace sulle entità
|
|
535
|
+
|
|
536
|
+
Le descrizioni di entità e query non sono decorazioni. Sono il modo in cui un'intelligenza artificiale apprende il significato del business.
|
|
537
|
+
|
|
538
|
+
Buone descrizioni a livello di entità spiegano:
|
|
539
|
+
|
|
540
|
+
- qual è l'oggetto
|
|
541
|
+
- quando dovrebbe essere interrogato
|
|
542
|
+
- cosa rappresenta in termini aziendali
|
|
543
|
+
- se si tratta di un record primario, di una tabella di ricerca o di una superficie derivata/di sola query
|
|
544
|
+
|
|
545
|
+
Esempio:
|
|
546
|
+
|
|
547
|
+
```csharp
|
|
548
|
+
[ChillEntity(
|
|
549
|
+
UniquePropertyKeyString: "4E16F6C0-6B95-4D67-98BC-9F4D0D63EAF1",
|
|
550
|
+
PrimaryLanguageLabel: "Invoice",
|
|
551
|
+
SecondaryLanguageLabel: "Fattura",
|
|
552
|
+
EnableMCP = true,
|
|
553
|
+
MCPDescription = "Customer invoice header. Use this schema to inspect invoice number, issue date, customer, total amount, and payment state.")]
|
|
554
|
+
public class Invoice : ChillEntity
|
|
555
|
+
{
|
|
556
|
+
}
|
|
557
|
+
```
|
|
558
|
+
|
|
559
|
+
Questo è molto più utile di:
|
|
560
|
+
|
|
561
|
+
-
|
|
562
|
+
-
|
|
563
|
+
|
|
564
|
+
## 4. Scrivi un testo `MCPDescription` efficace sulle proprietà
|
|
565
|
+
|
|
566
|
+
Le descrizioni delle proprietà contano ancora di più.
|
|
567
|
+
|
|
568
|
+
Quando un'IA riceve `get-schema`, ciascuna proprietà può portare il proprio `MCPDescription`. Questa è spesso la differenza tra una query corretta e una sbagliata.
|
|
569
|
+
|
|
570
|
+
Le buone descrizioni delle proprietà spiegano:
|
|
571
|
+
|
|
572
|
+
- il significato aziendale
|
|
573
|
+
- contenuto consentito o previsto
|
|
574
|
+
- unità o formato
|
|
575
|
+
- se il campo è una ricerca, un riferimento, uno stato, un codice o un testo libero
|
|
576
|
+
- se il campo viene restituito, filtrabile, calcolato o informativo
|
|
577
|
+
- per le proprietà della query, se la corrispondenza è esatta, contiene stile, basata su intervallo, basata su ricerca o personalizzata
|
|
578
|
+
|
|
579
|
+
Quando `MCPDescription` di una proprietà della query non spiega il comportamento di corrispondenza, gli agenti dovrebbero presupporre che la corrispondenza esatta sia uguale. Se desideri un comportamento contiene, prefisso, intervallo, fuzzy o specifico del dominio, specificalo esplicitamente nella descrizione.
|
|
580
|
+
|
|
581
|
+
Esempio:
|
|
582
|
+
|
|
583
|
+
```csharp
|
|
584
|
+
[ChillProperty(
|
|
585
|
+
UniquePropertyKeyString: "50B1BB6C-D794-41E4-A85C-D4F9D7A6FA7E",
|
|
586
|
+
PrimaryLanguageLabel: "Invoice number",
|
|
587
|
+
SecondaryLanguageLabel: "Numero fattura",
|
|
588
|
+
MCPDescription = "Human-readable accounting document number shown to users and used in external communication.")]
|
|
589
|
+
public string InvoiceNumber { get; set; } = string.Empty;
|
|
590
|
+
```
|
|
591
|
+
|
|
592
|
+
E:
|
|
593
|
+
|
|
594
|
+
```csharp
|
|
595
|
+
[ChillProperty(
|
|
596
|
+
UniquePropertyKeyString: "A18E7754-D8F7-45FE-B8A8-EA762A4EC9E6",
|
|
597
|
+
PrimaryLanguageLabel: "Payment status",
|
|
598
|
+
SecondaryLanguageLabel: "Stato pagamento",
|
|
599
|
+
MCPDescription = "Current payment lifecycle status. Expected values are Draft, Issued, PartiallyPaid, Paid, and Cancelled.")]
|
|
600
|
+
public string PaymentStatus { get; set; } = string.Empty;
|
|
601
|
+
```
|
|
602
|
+
|
|
603
|
+
Queste descrizioni vengono restituite da `ChillSharp get-schema`.
|
|
604
|
+
|
|
605
|
+
## 5. Preferisci tipi di query appositamente creati rispetto all'esposizione di tutto
|
|
606
|
+
|
|
607
|
+
L’intelligenza artificiale funziona meglio quando ha un numero limitato di query ben descritte anziché un’enorme superficie ambigua.
|
|
608
|
+
|
|
609
|
+
Preferisci diversi tipi di query chiari come:
|
|
610
|
+
|
|
611
|
+
-
|
|
612
|
+
-
|
|
613
|
+
-
|
|
614
|
+
|
|
615
|
+
invece di forzare l'intelligenza artificiale a dedurre tutto da una query generica generica.
|
|
616
|
+
|
|
617
|
+
Ogni query dovrebbe avere:
|
|
618
|
+
|
|
619
|
+
- un nome chiaro
|
|
620
|
+
- uno scopo chiaro
|
|
621
|
+
- proprietà di input ben descritte
|
|
622
|
+
- un tipo di entità correlata prevedibile
|
|
623
|
+
|
|
624
|
+
## 6. Mantieni gli input delle query limitati e significativi
|
|
625
|
+
|
|
626
|
+
Una query con venti input opzionali e significati vaghi è difficile per gli esseri umani e più difficile per l’intelligenza artificiale.
|
|
627
|
+
|
|
628
|
+
Preferisci una superficie di query in cui ogni input abbia uno scopo forte.
|
|
629
|
+
|
|
630
|
+
Bene:
|
|
631
|
+
|
|
632
|
+
-
|
|
633
|
+
-
|
|
634
|
+
-
|
|
635
|
+
-
|
|
636
|
+
|
|
637
|
+
Meno buono:
|
|
638
|
+
|
|
639
|
+
-
|
|
640
|
+
-
|
|
641
|
+
-
|
|
642
|
+
-
|
|
643
|
+
|
|
644
|
+
## 7. Esporre intenzionalmente i riferimenti
|
|
645
|
+
|
|
646
|
+
I riferimenti sono utili perché dicono a un'intelligenza artificiale come si relazionano tabelle ed entità.
|
|
647
|
+
|
|
648
|
+
Se una proprietà fa riferimento a un altro tipo di Chill, assicurati che:
|
|
649
|
+
|
|
650
|
+
- il riferimento è rappresentato tramite metadati Chill
|
|
651
|
+
- il tipo di destinazione ha uno schema utile
|
|
652
|
+
- la descrizione dell'immobile spiega la relazione
|
|
653
|
+
|
|
654
|
+
Esempio:
|
|
655
|
+
|
|
656
|
+
-
|
|
657
|
+
-
|
|
658
|
+
|
|
659
|
+
Ciò aiuta un'intelligenza artificiale a navigare nel grafico del tuo database invece di trattare ogni oggetto come isolato.
|
|
660
|
+
|
|
661
|
+
## 8. Mantieni le etichette utili
|
|
662
|
+
|
|
663
|
+
`Label`, `ShortLabel` e i nomi visualizzati dello schema aiutano un'intelligenza artificiale a scegliere l'oggetto giusto quando esistono molti tipi correlati.
|
|
664
|
+
|
|
665
|
+
Una buona etichetta è:
|
|
666
|
+
|
|
667
|
+
- stabile
|
|
668
|
+
- leggibile dall'uomo
|
|
669
|
+
- derivato dall'identità aziendale del record
|
|
670
|
+
|
|
671
|
+
Esempi:
|
|
672
|
+
|
|
673
|
+
- numero di fattura
|
|
674
|
+
- nome del cliente
|
|
675
|
+
- codice prodotto e titolo
|
|
676
|
+
|
|
677
|
+
Ciò migliora sia il comportamento dell'interfaccia utente che la comprensione dell'intelligenza artificiale.
|
|
678
|
+
|
|
679
|
+
## 9. Separare gli oggetti solo interni dagli oggetti rivolti verso l'IA
|
|
680
|
+
|
|
681
|
+
Non tutte le entità dovrebbero essere abilitate per MCP.
|
|
682
|
+
|
|
683
|
+
Una buona regola è:
|
|
684
|
+
|
|
685
|
+
- abilitare MCP solo per oggetti comprensibili e sicuri da esporre a un flusso di lavoro AI
|
|
686
|
+
- mantenere disabilitate le entità infrastrutturali di basso livello, le tabelle di registro o gli elementi interni sensibili a meno che non vi sia un motivo reale per pubblicarli
|
|
687
|
+
|
|
688
|
+
Ciò riduce la confusione, lo spreco di token e l'uso improprio accidentale.
|
|
689
|
+
|
|
690
|
+
## 10. Progetta tenendo presente i limiti dei permessi
|
|
691
|
+
|
|
692
|
+
L'utente autenticato della chiave API può essere limitato da autorizzazioni e altre limitazioni.
|
|
693
|
+
|
|
694
|
+
Ciò significa che un buon host rivolto all’intelligenza artificiale dovrebbe allinearsi:
|
|
695
|
+
|
|
696
|
+
- Schemi abilitati per MCP
|
|
697
|
+
- visibilità delle query
|
|
698
|
+
- autorizzazioni di autenticazione
|
|
699
|
+
- Proprietà della chiave API
|
|
700
|
+
|
|
701
|
+
Se diversi client necessitano di visibilità diversa, utilizza identità o profili di autorizzazione diversi anziché un'unica superficie MCP globale senza restrizioni.
|
|
702
|
+
|
|
703
|
+
## 11. Pensa in "ordine di lettura dell'IA"
|
|
704
|
+
|
|
705
|
+
Un tipico flusso di lavoro dell'agente è:
|
|
706
|
+
|
|
707
|
+
1. elencare gli schemi
|
|
708
|
+
2. scegline uno per nome e descrizione
|
|
709
|
+
3. ispezionare lo schema e le descrizioni delle proprietà
|
|
710
|
+
4. dedurre il tipo di entità correlata
|
|
711
|
+
5. creare una query
|
|
712
|
+
6. leggere i risultati
|
|
713
|
+
|
|
714
|
+
Quindi il modello dovrebbe supportare quella sequenza in modo pulito.
|
|
715
|
+
|
|
716
|
+
Chiediti:
|
|
717
|
+
|
|
718
|
+
- l'agente può identificare lo schema corretto leggendo il nome e la descrizione?
|
|
719
|
+
- può comprendere le proprietà senza la conoscenza tribale nascosta?
|
|
720
|
+
- può dire quale query restituisce quale entità?
|
|
721
|
+
- può evitare schemi irrilevanti?
|
|
722
|
+
|
|
723
|
+
In caso contrario, arricchisci i metadati.
|
|
724
|
+
|
|
725
|
+
## 12. Ottimizza per meno viaggi di andata e ritorno
|
|
726
|
+
|
|
727
|
+
I sistemi di intelligenza artificiale pagano un prezzo per ogni fase di scoperta.
|
|
728
|
+
|
|
729
|
+
Per mantenere efficienti i consumi:
|
|
730
|
+
|
|
731
|
+
- Fornire descrizioni dettagliate dello schema
|
|
732
|
+
- descrivere bene le proprietà la prima volta
|
|
733
|
+
- mantenere focalizzate le superfici delle query
|
|
734
|
+
- esporre le proprietà dei risultati comunemente necessarie
|
|
735
|
+
- evitare di forzare l'agente a indovinare i significati e riprovare
|
|
736
|
+
|
|
737
|
+
Metadati validi riducono l'utilizzo dei token, riducono i tentativi e producono risultati più affidabili.
|
|
738
|
+
|
|
739
|
+
## Lista di controllo pratica per l'intelligenza artificiale
|
|
740
|
+
|
|
741
|
+
Prima di esporre un modello tramite `ChillSharp.Mcp`, verificare che:
|
|
742
|
+
|
|
743
|
+
- i nomi delle entità sono chiari
|
|
744
|
+
- I nomi delle query sono chiari
|
|
745
|
+
- tutte le proprietà rivolte all'IA sono annotate con `[ChillProperty]`
|
|
746
|
+
- Gli schemi abilitati per MCP hanno utili `MCPDescription`
|
|
747
|
+
- le proprietà importanti hanno utili `MCPDescription`
|
|
748
|
+
- le query sono mirate e mirate
|
|
749
|
+
- i riferimenti sono descritti
|
|
750
|
+
- Le etichette sono significative
|
|
751
|
+
- gli schemi sensibili o rumorosi rimangono non MCP
|
|
752
|
+
- I limiti di autorizzazione e autorizzazione corrispondono al caso d'uso AI previsto
|
|
753
|
+
|
|
754
|
+
## Esempio di frammento di modello compatibile con l'intelligenza artificiale
|
|
755
|
+
|
|
756
|
+
```csharp
|
|
757
|
+
using ChillSharp.Annotations;
|
|
758
|
+
using ChillSharp.EF;
|
|
759
|
+
|
|
760
|
+
[ChillEntity(
|
|
761
|
+
UniquePropertyKeyString: "4E16F6C0-6B95-4D67-98BC-9F4D0D63EAF1",
|
|
762
|
+
PrimaryLanguageLabel: "Invoice",
|
|
763
|
+
SecondaryLanguageLabel: "Fattura",
|
|
764
|
+
EnableMCP = true,
|
|
765
|
+
MCPDescription = "Customer invoice header. Use it to inspect invoice identity, customer, dates, totals, and payment state.")]
|
|
766
|
+
public class Invoice : ChillEntity
|
|
767
|
+
{
|
|
768
|
+
[ChillProperty(
|
|
769
|
+
UniquePropertyKeyString: "50B1BB6C-D794-41E4-A85C-D4F9D7A6FA7E",
|
|
770
|
+
PrimaryLanguageLabel: "Invoice number",
|
|
771
|
+
SecondaryLanguageLabel: "Numero fattura",
|
|
772
|
+
MCPDescription = "Human-readable invoice number used by accountants and customers.")]
|
|
773
|
+
public string InvoiceNumber { get; set; } = string.Empty;
|
|
774
|
+
|
|
775
|
+
[ChillProperty(
|
|
776
|
+
UniquePropertyKeyString: "A18E7754-D8F7-45FE-B8A8-EA762A4EC9E6",
|
|
777
|
+
PrimaryLanguageLabel: "Customer",
|
|
778
|
+
SecondaryLanguageLabel: "Cliente",
|
|
779
|
+
MCPDescription = "Customer that owns this invoice.",
|
|
780
|
+
ReferenceChillTypeQuery = "Query.CustomerQuery")]
|
|
781
|
+
public Customer? Customer { get; set; }
|
|
782
|
+
|
|
783
|
+
[ChillProperty(
|
|
784
|
+
UniquePropertyKeyString: "D6A6A0B6-3C22-4E18-B2AE-34D6EBE56EC8",
|
|
785
|
+
PrimaryLanguageLabel: "Payment status",
|
|
786
|
+
SecondaryLanguageLabel: "Stato pagamento",
|
|
787
|
+
MCPDescription = "Current payment lifecycle status such as Draft, Issued, Paid, or Cancelled.")]
|
|
788
|
+
public string PaymentStatus { get; set; } = string.Empty;
|
|
789
|
+
}
|
|
790
|
+
```
|
|
791
|
+
|
|
792
|
+
## Documenti correlati
|
|
793
|
+
|
|
794
|
+
- [Istruzioni per la connessione ChatGPT](ChatGPT.md)
|
|
795
|
+
- [../README.md](../README.md)
|
|
796
|
+
- [../RegisterContext.md](../RegisterContext.md)
|
|
797
|
+
- [../ModelPreparation.md](../ModelPreparation.md)
|
|
798
|
+
- [../AIAssistedDevelopment/README.md](../AIAssistedDevelopment/README.md)
|
|
799
|
+
- [../../ChillSharp.Mcp/README.md](../../ChillSharp.Mcp/README.md)
|