langflow-base-nightly 0.5.0.dev12__py3-none-any.whl → 0.5.0.dev13__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.
- langflow/alembic/versions/3162e83e485f_add_auth_settings_to_folder_and_merge.py +58 -0
- langflow/api/v1/flows.py +11 -1
- langflow/api/v1/mcp_projects.py +30 -9
- langflow/api/v1/schemas.py +36 -0
- langflow/frontend/assets/{SlackIcon-Cd-iPC0i.js → SlackIcon-B1waip4k.js} +1 -1
- langflow/frontend/assets/{Wikipedia-B5O6n7F0.js → Wikipedia-C5dnUOP0.js} +1 -1
- langflow/frontend/assets/{Wolfram-B1KmVRjM.js → Wolfram-DhcO0RVc.js} +1 -1
- langflow/frontend/assets/{index-DGxSiTMA.js → index-3biIaEbi.js} +1 -1
- langflow/frontend/assets/{index-Cnyx1zv_.js → index-418YVFa2.js} +1 -1
- langflow/frontend/assets/{index-trtHEGn4.js → index-606CKdUf.js} +1 -1
- langflow/frontend/assets/{index-DvvsljHV.js → index-8DyHY_Bk.js} +1 -1
- langflow/frontend/assets/{index-D4RRUGPu.js → index-9TR2hnD_.js} +1 -1
- langflow/frontend/assets/{index-BWns2-go.js → index-B5ZG67DK.js} +1 -1
- langflow/frontend/assets/{index-C1ubG8J7.js → index-B6e8DnbV.js} +1 -1
- langflow/frontend/assets/{index-BfYTMI38.js → index-BBGrtgHW.js} +1 -1
- langflow/frontend/assets/{index-BiYFSEAn.js → index-BC8MvYGc.js} +1 -1
- langflow/frontend/assets/{index-C2eoNYzo.js → index-BCSQ18YB.js} +1 -1
- langflow/frontend/assets/{index-DH7MmlxY.js → index-BC_ZSBd8.js} +1 -1
- langflow/frontend/assets/{index-BlL8HUNA.js → index-BGoj1qt5.js} +1 -1
- langflow/frontend/assets/{index-Cjhx7z0R.js → index-BHZEUpSJ.js} +1 -1
- langflow/frontend/assets/{index-CiyaGz0z.js → index-BMXOUkQC.js} +1 -1
- langflow/frontend/assets/{index-BaSBldE9.js → index-BONWErnQ.js} +1 -1
- langflow/frontend/assets/{index-Bt6jcZAU.js → index-BSw4Njsa.js} +1 -1
- langflow/frontend/assets/{index-BPJt8Ile.js → index-BTgluuBN.js} +1 -1
- langflow/frontend/assets/{index-Cq4MI2y5.js → index-BU-Bn5mu.js} +1 -1
- langflow/frontend/assets/{index-WV_k1wNl.js → index-BYlJ6oLH.js} +1 -1
- langflow/frontend/assets/{index-DIO5INGs.js → index-Bbl1tT9J.js} +1 -1
- langflow/frontend/assets/{index-DIacckva.js → index-Bf5rmL-A.js} +1 -1
- langflow/frontend/assets/{index-CcLzwnrn.js → index-BfeYY-C1.js} +1 -1
- langflow/frontend/assets/{index-CdmrGwb4.js → index-BlMOr3_J.js} +1 -1
- langflow/frontend/assets/{index-Njr5X1kT.js → index-Bn6oRo0n.js} +1 -1
- langflow/frontend/assets/{index-BPlGsMrz.js → index-BrG-lJ13.js} +1 -1
- langflow/frontend/assets/{index-Zl1mc460.js → index-Bt6nxewq.js} +1 -1
- langflow/frontend/assets/{index-B0JZGX06.js → index-BwVK35FL.js} +1 -1
- langflow/frontend/assets/{index-Cx7TvKYK.js → index-C-s9qpIS.js} +1 -1
- langflow/frontend/assets/{index-DYEuD_-s.js → index-C0HZtOht.js} +1 -1
- langflow/frontend/assets/{index-yltn8z-g.js → index-C3HQLjdj.js} +1 -1
- langflow/frontend/assets/{index-DqdLKSt1.js → index-C5kZL0cq.js} +1 -1
- langflow/frontend/assets/{index-wlS4KkAL.js → index-C7_J2NrZ.js} +1 -1
- langflow/frontend/assets/{index-C7FLVNCj.js → index-CALzRXXv.js} +1 -1
- langflow/frontend/assets/{index-BNWrL3Nq.js → index-CBUjLnxi.js} +1 -1
- langflow/frontend/assets/{index-pVelLfiC.js → index-CCIWuZBs.js} +1 -1
- langflow/frontend/assets/{index-D5PS_CB4.js → index-CDEm9KAj.js} +1 -1
- langflow/frontend/assets/{index-DdZkgdvz.js → index-CDSjGlZV.js} +1 -1
- langflow/frontend/assets/{index-IS7u-AWK.js → index-CDbyKwTG.js} +1 -1
- langflow/frontend/assets/{index-DgfNw4kh.js → index-CDpU78JK.js} +1 -1
- langflow/frontend/assets/{index-CCTmOZ1g.js → index-CDuvFcaF.js} +1 -1
- langflow/frontend/assets/{index-BXIyV5lK.js → index-CKPKfZJn.js} +1 -1
- langflow/frontend/assets/{index-DeYteZja.js → index-CLbIIEk2.js} +1 -1
- langflow/frontend/assets/{index-DU2YH66I.js → index-CPg6geGH.js} +1 -1
- langflow/frontend/assets/{index-D7g4wvHP.js → index-CRjDABKd.js} +1 -1
- langflow/frontend/assets/{index-BsMrsX7Y.js → index-CViOvTFf.js} +1 -1
- langflow/frontend/assets/{index-B2CCM4c7.js → index-CXUUEanr.js} +1 -1
- langflow/frontend/assets/{index-CDtWHxP4.js → index-C_euB6Gl.js} +1 -1
- langflow/frontend/assets/{index-DnC_DVAY.js → index-Casu8D9q.js} +1 -1
- langflow/frontend/assets/{index-E-Das2ND.js → index-Cg4VEh3c.js} +1 -1
- langflow/frontend/assets/{index-BSMo_rVR.js → index-CgIcVOr8.js} +1 -1
- langflow/frontend/assets/{index-CQ51i8ln.js → index-Cg_tVm4-.js} +1 -1
- langflow/frontend/assets/{index-Cq-gdL8y.js → index-ChqaoD3t.js} +1 -1
- langflow/frontend/assets/{index-CBWFia1e.js → index-Cm0S83En.js} +1 -1
- langflow/frontend/assets/{index-BUP8cpdy.js → index-CmGwOqUn.js} +1 -1
- langflow/frontend/assets/{index-DYTJUdhK.js → index-CsndNop1.js} +1 -1
- langflow/frontend/assets/{index-NiPHCs9R.js → index-D3JSU9T-.js} +1 -1
- langflow/frontend/assets/{index-BK6HLE9w.js → index-D3dEuwpy.js} +1 -1
- langflow/frontend/assets/index-D4GoWOiL.css +1 -0
- langflow/frontend/assets/{index-BUfHQ67-.js → index-D6ea_8pm.js} +1 -1
- langflow/frontend/assets/{index-D9-bSYSJ.js → index-D7Zt_u8q.js} +1 -1
- langflow/frontend/assets/{index-CUrntRcy.js → index-D9hSZOYT.js} +1 -1
- langflow/frontend/assets/{index-7fK3jqXA.js → index-DB7TCTGT.js} +1 -1
- langflow/frontend/assets/{index-Cw37ANcv.js → index-DBmHwu6w.js} +1 -1
- langflow/frontend/assets/{index-Bf8t8j9X.js → index-DCetRusr.js} +1 -1
- langflow/frontend/assets/{index-BZkwz56n.js → index-DFTYUoaZ.js} +1 -1
- langflow/frontend/assets/{index-BOT3JtBi.js → index-DFiKJBMw.js} +1 -1
- langflow/frontend/assets/{index-DQk0_I5B.js → index-DH7xKo5T.js} +1 -1
- langflow/frontend/assets/{index-TPkBqDKK.js → index-DKVaEmO7.js} +1 -1
- langflow/frontend/assets/{index-BDro7umg.js → index-DM_Uy5wE.js} +1 -1
- langflow/frontend/assets/{index-BLbBvwMG.js → index-DMumbC9j.js} +1 -1
- langflow/frontend/assets/{index-Bk6ndAzQ.js → index-DOD107en.js} +1 -1
- langflow/frontend/assets/{index-C8p_It-q.js → index-DOW9ZSLB.js} +1 -1
- langflow/frontend/assets/{index-CJ1toud0.js → index-DQHDRmym.js} +1 -1
- langflow/frontend/assets/{index-DkBWSKtg.js → index-DUE44GEX.js} +1 -1
- langflow/frontend/assets/{index-CwWRSdlX.js → index-DYrXxgrb.js} +1 -1
- langflow/frontend/assets/{index-B2Z_1lFD.js → index-DYv6Aras.js} +1 -1
- langflow/frontend/assets/{index-BhR1ql7g.js → index-DZgXMtLr.js} +1 -1
- langflow/frontend/assets/{index-DD5XYrer.js → index-Dcalb9GV.js} +1 -1
- langflow/frontend/assets/{index-CxVYbglb.js → index-DgAnAkZI.js} +1 -1
- langflow/frontend/assets/{index-DcKifWWJ.js → index-Dh4QIx-9.js} +1 -1
- langflow/frontend/assets/{index-DB5GTOxo.js → index-DiC6aHWh.js} +1 -1
- langflow/frontend/assets/{index-BDFdZay1.js → index-DjQo2TKu.js} +1 -1
- langflow/frontend/assets/{index-CaWlxCMX.js → index-Dm2EC55c.js} +1 -1
- langflow/frontend/assets/{index-vf00qo3y.js → index-Dn6DEQeW.js} +1 -1
- langflow/frontend/assets/{index-ci6Tgpk-.js → index-DpVlWsbf.js} +1 -1
- langflow/frontend/assets/{index-DXGN9orR.js → index-DpxIP5eR.js} +1 -1
- langflow/frontend/assets/{index-DwRUBFIA.js → index-DtNmksPw.js} +1 -1
- langflow/frontend/assets/{index-CXFub5LB.js → index-DvZa-h7F.js} +1 -1
- langflow/frontend/assets/{index-ZFy5V-_D.js → index-DvfpMNxC.js} +1 -1
- langflow/frontend/assets/{index-JmqTXg4E.js → index-DwSpFzJE.js} +1 -1
- langflow/frontend/assets/{index-CjtaM5UL.js → index-Dxt2wnqB.js} +1 -1
- langflow/frontend/assets/{index-Czcvxutv.js → index-Dym17axM.js} +1 -1
- langflow/frontend/assets/{index-DH__etxq.js → index-FRFezpnl.js} +1 -1
- langflow/frontend/assets/{index-BlPey1Ki.js → index-JXRrBiMq.js} +1 -1
- langflow/frontend/assets/{index-C9fRGeXM.js → index-JnJLq8vw.js} +1 -1
- langflow/frontend/assets/{index-B7FkNOyn.js → index-Lj5U_BEs.js} +1 -1
- langflow/frontend/assets/{index-Mxd-VEGG.js → index-MzhQqWgp.js} +1 -1
- langflow/frontend/assets/{index-CFEOHn80.js → index-Nrq24q0b.js} +1 -1
- langflow/frontend/assets/{index-CdiZnmSW.js → index-PR9CDiB2.js} +1 -1
- langflow/frontend/assets/{index-ByKS3Reb.js → index-Ps_-SFhI.js} +1 -1
- langflow/frontend/assets/{index-3mCR-Tl2.js → index-QtS6b7Sw.js} +1 -1
- langflow/frontend/assets/{index-ar9TCMv3.js → index-SG4iMGMH.js} +1 -1
- langflow/frontend/assets/{index-CR-CAff6.js → index-VgSSRzOC.js} +1 -1
- langflow/frontend/assets/{index-Djj7W9O2.js → index-VroAkSXX.js} +1 -1
- langflow/frontend/assets/{index-Ch3GcMU1.js → index-XRYx-9PH.js} +1 -1
- langflow/frontend/assets/{index-D7jQaHFe.js → index-X_N2VjCI.js} +1 -1
- langflow/frontend/assets/{index-DjsYYwW0.js → index-ZEtb94y9.js} +1 -1
- langflow/frontend/assets/{index-8w8XYprB.js → index-ZdUecE-Q.js} +1 -1
- langflow/frontend/assets/{index-ag1C0oAb.js → index-eGM7b_zA.js} +1 -1
- langflow/frontend/assets/{index-BBX2kVSz.js → index-ewyyoy2D.js} +1 -1
- langflow/frontend/assets/{index-D-49kYTz.js → index-gY4GknXS.js} +1 -1
- langflow/frontend/assets/{index-ijhn48uz.js → index-gm2XOLA2.js} +1 -1
- langflow/frontend/assets/{index-C0rt4CxC.js → index-ipP5SzLr.js} +1 -1
- langflow/frontend/assets/{index-BOI0y4_3.js → index-is0kQpz3.js} +1 -1
- langflow/frontend/assets/{index-DymMkWXl.js → index-kElqCHmt.js} +1 -1
- langflow/frontend/assets/{index-WyGaeQRK.js → index-kQTNfH4u.js} +1 -1
- langflow/frontend/assets/{index-OE--aySz.js → index-m4Hpi_aX.js} +1 -1
- langflow/frontend/assets/{index-BBgfRNJR.js → index-nLSeiMV2.js} +1 -1
- langflow/frontend/assets/{index-BA1jLhEh.js → index-rDnX1gJr.js} +1907 -1907
- langflow/frontend/assets/{index-6yw70teP.js → index-zO8eyFDr.js} +1 -1
- langflow/frontend/assets/lazyIconImports-GHEHdmsf.js +2 -0
- langflow/frontend/assets/{use-post-add-user-C6MTbdJe.js → use-post-add-user-BanYOJbs.js} +1 -1
- langflow/frontend/index.html +2 -2
- langflow/services/database/models/folder/model.py +7 -1
- langflow/services/settings/feature_flags.py +1 -0
- {langflow_base_nightly-0.5.0.dev12.dist-info → langflow_base_nightly-0.5.0.dev13.dist-info}/METADATA +1 -1
- {langflow_base_nightly-0.5.0.dev12.dist-info → langflow_base_nightly-0.5.0.dev13.dist-info}/RECORD +136 -135
- langflow/frontend/assets/index-MB8UM6Ob.css +0 -1
- langflow/frontend/assets/lazyIconImports-CyCY07be.js +0 -2
- {langflow_base_nightly-0.5.0.dev12.dist-info → langflow_base_nightly-0.5.0.dev13.dist-info}/WHEEL +0 -0
- {langflow_base_nightly-0.5.0.dev12.dist-info → langflow_base_nightly-0.5.0.dev13.dist-info}/entry_points.txt +0 -0
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"""Add auth_settings column to folder table and merge migration branches.
|
|
2
|
+
|
|
3
|
+
Revision ID: 3162e83e485f
|
|
4
|
+
Revises: 0ae3a2674f32, d9a6ea21edcd
|
|
5
|
+
Create Date: 2025-01-16 13:00:00.000000
|
|
6
|
+
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from collections.abc import Sequence
|
|
10
|
+
|
|
11
|
+
import sqlalchemy as sa
|
|
12
|
+
from alembic import op
|
|
13
|
+
|
|
14
|
+
# revision identifiers, used by Alembic.
|
|
15
|
+
revision: str = "3162e83e485f"
|
|
16
|
+
down_revision: str | Sequence[str] | None = ("0ae3a2674f32", "d9a6ea21edcd")
|
|
17
|
+
branch_labels: str | Sequence[str] | None = None
|
|
18
|
+
depends_on: str | Sequence[str] | None = None
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def upgrade() -> None:
|
|
22
|
+
"""Add auth_settings column to folder table and merge migration branches."""
|
|
23
|
+
conn = op.get_bind()
|
|
24
|
+
inspector = sa.inspect(conn)
|
|
25
|
+
|
|
26
|
+
# Check if folder table exists
|
|
27
|
+
table_names = inspector.get_table_names()
|
|
28
|
+
if "folder" not in table_names:
|
|
29
|
+
# If folder table doesn't exist, skip this migration
|
|
30
|
+
return
|
|
31
|
+
|
|
32
|
+
# Get current column names in folder table
|
|
33
|
+
column_names = [column["name"] for column in inspector.get_columns("folder")]
|
|
34
|
+
|
|
35
|
+
# Add auth_settings column to folder table if it doesn't exist
|
|
36
|
+
with op.batch_alter_table("folder", schema=None) as batch_op:
|
|
37
|
+
if "auth_settings" not in column_names:
|
|
38
|
+
batch_op.add_column(sa.Column("auth_settings", sa.JSON(), nullable=True))
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def downgrade() -> None:
|
|
42
|
+
"""Remove auth_settings column from folder table."""
|
|
43
|
+
conn = op.get_bind()
|
|
44
|
+
inspector = sa.inspect(conn)
|
|
45
|
+
|
|
46
|
+
# Check if folder table exists
|
|
47
|
+
table_names = inspector.get_table_names()
|
|
48
|
+
if "folder" not in table_names:
|
|
49
|
+
# If folder table doesn't exist, skip this migration
|
|
50
|
+
return
|
|
51
|
+
|
|
52
|
+
# Get current column names in folder table
|
|
53
|
+
column_names = [column["name"] for column in inspector.get_columns("folder")]
|
|
54
|
+
|
|
55
|
+
# Remove auth_settings column from folder table if it exists
|
|
56
|
+
with op.batch_alter_table("folder", schema=None) as batch_op:
|
|
57
|
+
if "auth_settings" in column_names:
|
|
58
|
+
batch_op.drop_column("auth_settings")
|
langflow/api/v1/flows.py
CHANGED
|
@@ -83,7 +83,15 @@ async def _new_flow(
|
|
|
83
83
|
)
|
|
84
84
|
).all()
|
|
85
85
|
if flows:
|
|
86
|
-
|
|
86
|
+
# Use regex to extract numbers only from flows that follow the copy naming pattern:
|
|
87
|
+
# "{original_name} ({number})"
|
|
88
|
+
# This avoids extracting numbers from the original flow name if it naturally contains parentheses
|
|
89
|
+
#
|
|
90
|
+
# Examples:
|
|
91
|
+
# - For flow "My Flow": matches "My Flow (1)", "My Flow (2)" → extracts 1, 2
|
|
92
|
+
# - For flow "Analytics (Q1)": matches "Analytics (Q1) (1)" → extracts 1
|
|
93
|
+
# but does NOT match "Analytics (Q1)" → avoids extracting the original "1"
|
|
94
|
+
extract_number = re.compile(rf"^{re.escape(flow.name)} \((\d+)\)$")
|
|
87
95
|
numbers = []
|
|
88
96
|
for _flow in flows:
|
|
89
97
|
result = extract_number.search(_flow.name)
|
|
@@ -91,6 +99,8 @@ async def _new_flow(
|
|
|
91
99
|
numbers.append(int(result.groups(1)[0]))
|
|
92
100
|
if numbers:
|
|
93
101
|
flow.name = f"{flow.name} ({max(numbers) + 1})"
|
|
102
|
+
else:
|
|
103
|
+
flow.name = f"{flow.name} (1)"
|
|
94
104
|
else:
|
|
95
105
|
flow.name = f"{flow.name} (1)"
|
|
96
106
|
# Now check if the endpoint is unique
|
langflow/api/v1/mcp_projects.py
CHANGED
|
@@ -29,11 +29,17 @@ from langflow.api.v1.mcp_utils import (
|
|
|
29
29
|
handle_mcp_errors,
|
|
30
30
|
handle_read_resource,
|
|
31
31
|
)
|
|
32
|
-
from langflow.api.v1.schemas import
|
|
32
|
+
from langflow.api.v1.schemas import (
|
|
33
|
+
MCPInstallRequest,
|
|
34
|
+
MCPProjectResponse,
|
|
35
|
+
MCPProjectUpdateRequest,
|
|
36
|
+
MCPSettings,
|
|
37
|
+
)
|
|
33
38
|
from langflow.base.mcp.constants import MAX_MCP_SERVER_NAME_LENGTH
|
|
34
39
|
from langflow.base.mcp.util import sanitize_mcp_name
|
|
35
40
|
from langflow.services.database.models import Flow, Folder
|
|
36
41
|
from langflow.services.deps import get_settings_service, session_scope
|
|
42
|
+
from langflow.services.settings.feature_flags import FEATURE_FLAGS
|
|
37
43
|
|
|
38
44
|
logger = logging.getLogger(__name__)
|
|
39
45
|
|
|
@@ -60,7 +66,7 @@ async def list_project_tools(
|
|
|
60
66
|
current_user: CurrentActiveMCPUser,
|
|
61
67
|
*,
|
|
62
68
|
mcp_enabled: bool = True,
|
|
63
|
-
) ->
|
|
69
|
+
) -> MCPProjectResponse:
|
|
64
70
|
"""List all tools in a project that are enabled for MCP."""
|
|
65
71
|
tools: list[MCPSettings] = []
|
|
66
72
|
try:
|
|
@@ -114,12 +120,19 @@ async def list_project_tools(
|
|
|
114
120
|
logger.warning(msg)
|
|
115
121
|
continue
|
|
116
122
|
|
|
123
|
+
# Get project-level auth settings
|
|
124
|
+
auth_settings = None
|
|
125
|
+
if project.auth_settings:
|
|
126
|
+
from langflow.api.v1.schemas import AuthSettings
|
|
127
|
+
|
|
128
|
+
auth_settings = AuthSettings(**project.auth_settings)
|
|
129
|
+
|
|
117
130
|
except Exception as e:
|
|
118
131
|
msg = f"Error listing project tools: {e!s}"
|
|
119
132
|
logger.exception(msg)
|
|
120
133
|
raise HTTPException(status_code=500, detail=str(e)) from e
|
|
121
134
|
|
|
122
|
-
return tools
|
|
135
|
+
return MCPProjectResponse(tools=tools, auth_settings=auth_settings)
|
|
123
136
|
|
|
124
137
|
|
|
125
138
|
@router.head("/{project_id}/sse", response_class=HTMLResponse, include_in_schema=False)
|
|
@@ -218,10 +231,10 @@ async def handle_project_messages_with_slash(project_id: UUID, request: Request,
|
|
|
218
231
|
@router.patch("/{project_id}", status_code=200)
|
|
219
232
|
async def update_project_mcp_settings(
|
|
220
233
|
project_id: UUID,
|
|
221
|
-
|
|
234
|
+
request: MCPProjectUpdateRequest,
|
|
222
235
|
current_user: CurrentActiveMCPUser,
|
|
223
236
|
):
|
|
224
|
-
"""Update the MCP settings of all flows in a project."""
|
|
237
|
+
"""Update the MCP settings of all flows in a project and project-level auth settings."""
|
|
225
238
|
try:
|
|
226
239
|
async with session_scope() as session:
|
|
227
240
|
# Fetch the project first to verify it exists and belongs to the current user
|
|
@@ -236,9 +249,16 @@ async def update_project_mcp_settings(
|
|
|
236
249
|
if not project:
|
|
237
250
|
raise HTTPException(status_code=404, detail="Project not found")
|
|
238
251
|
|
|
252
|
+
# Update project-level auth settings
|
|
253
|
+
if request.auth_settings:
|
|
254
|
+
project.auth_settings = request.auth_settings.model_dump(mode="json")
|
|
255
|
+
else:
|
|
256
|
+
project.auth_settings = None
|
|
257
|
+
session.add(project)
|
|
258
|
+
|
|
239
259
|
# Query flows in the project
|
|
240
260
|
flows = (await session.exec(select(Flow).where(Flow.folder_id == project_id))).all()
|
|
241
|
-
flows_to_update = {x.id: x for x in settings}
|
|
261
|
+
flows_to_update = {x.id: x for x in request.settings}
|
|
242
262
|
|
|
243
263
|
updated_flows = []
|
|
244
264
|
for flow in flows:
|
|
@@ -256,7 +276,7 @@ async def update_project_mcp_settings(
|
|
|
256
276
|
|
|
257
277
|
await session.commit()
|
|
258
278
|
|
|
259
|
-
return {"message": f"Updated MCP settings for {len(updated_flows)} flows"}
|
|
279
|
+
return {"message": f"Updated MCP settings for {len(updated_flows)} flows and project auth settings"}
|
|
260
280
|
|
|
261
281
|
except Exception as e:
|
|
262
282
|
msg = f"Error updating project MCP settings: {e!s}"
|
|
@@ -348,7 +368,8 @@ async def install_mcp_config(
|
|
|
348
368
|
# Determine command and args based on operating system
|
|
349
369
|
os_type = platform.system()
|
|
350
370
|
command = "uvx"
|
|
351
|
-
|
|
371
|
+
mcp_tool = "mcp-composer" if FEATURE_FLAGS.mcp_composer else "mcp-proxy"
|
|
372
|
+
args = [mcp_tool, sse_url]
|
|
352
373
|
|
|
353
374
|
# Check if running on WSL (will appear as Linux but with Microsoft in release info)
|
|
354
375
|
is_wsl = os_type == "Linux" and "microsoft" in platform.uname().release.lower()
|
|
@@ -381,7 +402,7 @@ async def install_mcp_config(
|
|
|
381
402
|
|
|
382
403
|
if os_type == "Windows":
|
|
383
404
|
command = "cmd"
|
|
384
|
-
args = ["/c", "uvx",
|
|
405
|
+
args = ["/c", "uvx", mcp_tool, sse_url]
|
|
385
406
|
logger.debug("Windows detected, using cmd command")
|
|
386
407
|
|
|
387
408
|
name = project.name
|
langflow/api/v1/schemas.py
CHANGED
|
@@ -8,6 +8,7 @@ from pydantic import (
|
|
|
8
8
|
BaseModel,
|
|
9
9
|
ConfigDict,
|
|
10
10
|
Field,
|
|
11
|
+
SecretStr,
|
|
11
12
|
field_serializer,
|
|
12
13
|
field_validator,
|
|
13
14
|
model_serializer,
|
|
@@ -440,6 +441,27 @@ class CancelFlowResponse(BaseModel):
|
|
|
440
441
|
message: str
|
|
441
442
|
|
|
442
443
|
|
|
444
|
+
class AuthSettings(BaseModel):
|
|
445
|
+
"""Model representing authentication settings for MCP."""
|
|
446
|
+
|
|
447
|
+
auth_type: Literal["none", "apikey", "basic", "bearer", "iam", "oauth"] = "none"
|
|
448
|
+
api_key: SecretStr | None = None
|
|
449
|
+
username: str | None = None
|
|
450
|
+
password: SecretStr | None = None
|
|
451
|
+
bearer_token: SecretStr | None = None
|
|
452
|
+
iam_endpoint: str | None = None
|
|
453
|
+
oauth_host: str | None = None
|
|
454
|
+
oauth_port: str | None = None
|
|
455
|
+
oauth_server_url: str | None = None
|
|
456
|
+
oauth_callback_path: str | None = None
|
|
457
|
+
oauth_client_id: str | None = None
|
|
458
|
+
oauth_client_secret: str | None = None
|
|
459
|
+
oauth_auth_url: str | None = None
|
|
460
|
+
oauth_token_url: str | None = None
|
|
461
|
+
oauth_mcp_scope: str | None = None
|
|
462
|
+
oauth_provider_scope: str | None = None
|
|
463
|
+
|
|
464
|
+
|
|
443
465
|
class MCPSettings(BaseModel):
|
|
444
466
|
"""Model representing MCP settings for a flow."""
|
|
445
467
|
|
|
@@ -451,5 +473,19 @@ class MCPSettings(BaseModel):
|
|
|
451
473
|
description: str | None = None
|
|
452
474
|
|
|
453
475
|
|
|
476
|
+
class MCPProjectUpdateRequest(BaseModel):
|
|
477
|
+
"""Request model for updating MCP project settings including auth."""
|
|
478
|
+
|
|
479
|
+
settings: list[MCPSettings]
|
|
480
|
+
auth_settings: AuthSettings | None = None
|
|
481
|
+
|
|
482
|
+
|
|
483
|
+
class MCPProjectResponse(BaseModel):
|
|
484
|
+
"""Response model for MCP project tools with auth settings."""
|
|
485
|
+
|
|
486
|
+
tools: list[MCPSettings]
|
|
487
|
+
auth_settings: AuthSettings | None = None
|
|
488
|
+
|
|
489
|
+
|
|
454
490
|
class MCPInstallRequest(BaseModel):
|
|
455
491
|
client: str
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{j as a}from"./index-
|
|
1
|
+
import{j as a}from"./index-rDnX1gJr.js";const s=l=>a.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 54 54",width:"1em",height:"1em",...l,children:a.jsxs("g",{fill:"none",fillRule:"evenodd",children:[a.jsx("path",{fill:"#36C5F0",d:"M19.712.133a5.381 5.381 0 0 0-5.376 5.387 5.381 5.381 0 0 0 5.376 5.386h5.376V5.52A5.381 5.381 0 0 0 19.712.133m0 14.365H5.376A5.381 5.381 0 0 0 0 19.884a5.381 5.381 0 0 0 5.376 5.387h14.336a5.381 5.381 0 0 0 5.376-5.387 5.381 5.381 0 0 0-5.376-5.386"}),a.jsx("path",{fill:"#2EB67D",d:"M53.76 19.884a5.381 5.381 0 0 0-5.376-5.386 5.381 5.381 0 0 0-5.376 5.386v5.387h5.376a5.381 5.381 0 0 0 5.376-5.387m-14.336 0V5.52A5.381 5.381 0 0 0 34.048.133a5.381 5.381 0 0 0-5.376 5.387v14.364a5.381 5.381 0 0 0 5.376 5.387 5.381 5.381 0 0 0 5.376-5.387"}),a.jsx("path",{fill:"#ECB22E",d:"M34.048 54a5.381 5.381 0 0 0 5.376-5.387 5.381 5.381 0 0 0-5.376-5.386h-5.376v5.386A5.381 5.381 0 0 0 34.048 54m0-14.365h14.336a5.381 5.381 0 0 0 5.376-5.386 5.381 5.381 0 0 0-5.376-5.387H34.048a5.381 5.381 0 0 0-5.376 5.387 5.381 5.381 0 0 0 5.376 5.386"}),a.jsx("path",{fill:"#E01E5A",d:"M0 34.249a5.381 5.381 0 0 0 5.376 5.386 5.381 5.381 0 0 0 5.376-5.386v-5.387H5.376A5.381 5.381 0 0 0 0 34.25m14.336-.001v14.364A5.381 5.381 0 0 0 19.712 54a5.381 5.381 0 0 0 5.376-5.387V34.25a5.381 5.381 0 0 0-5.376-5.387 5.381 5.381 0 0 0-5.376 5.387"})]})});export{s as default};
|