Skip to content

Commit fdf7e27

Browse files
Initial plan for fixing linter errors
Co-authored-by: kevinbackhouse <[email protected]>
1 parent 10c6eb3 commit fdf7e27

File tree

13 files changed

+101
-98
lines changed

13 files changed

+101
-98
lines changed

src/seclab_taskflows/mcp_servers/alert_results_models.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
# SPDX-FileCopyrightText: 2025 GitHub
22
# SPDX-License-Identifier: MIT
33

4-
from sqlalchemy import String, Text, Integer, ForeignKey, Column
5-
from sqlalchemy.orm import DeclarativeBase, mapped_column, Mapped, relationship
64
from typing import Optional
75

6+
from sqlalchemy import Column, ForeignKey, Integer, Text
7+
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, relationship
8+
9+
810
class Base(DeclarativeBase):
911
pass
1012

src/seclab_taskflows/mcp_servers/codeql_python/codeql_sqlite_models.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
# SPDX-FileCopyrightText: 2025 GitHub
22
# SPDX-License-Identifier: MIT
33

4-
from sqlalchemy import Text
5-
from sqlalchemy.orm import DeclarativeBase, mapped_column, Mapped
64
from typing import Optional
75

6+
from sqlalchemy import Text
7+
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
8+
9+
810
class Base(DeclarativeBase):
911
pass
1012

src/seclab_taskflows/mcp_servers/codeql_python/mcp_server.py

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3,29 +3,31 @@
33

44

55
import logging
6+
67
logging.basicConfig(
78
level=logging.DEBUG,
89
format='%(asctime)s - %(levelname)s - %(message)s',
910
filename='logs/mcp_codeql_python.log',
1011
filemode='a'
1112
)
12-
from seclab_taskflow_agent.mcp_servers.codeql.client import run_query, _debug_log
13-
# from seclab_taskflow_agent.path_utils import mcp_data_dir
14-
15-
from pydantic import Field
16-
#from mcp.server.fastmcp import FastMCP, Context
17-
from fastmcp import FastMCP # use FastMCP 2.0
18-
from pathlib import Path
19-
import os
2013
import csv
14+
import importlib.resources
2115
import json
16+
import os
17+
import subprocess
18+
from pathlib import Path
19+
20+
#from mcp.server.fastmcp import FastMCP, Context
21+
from fastmcp import FastMCP # use FastMCP 2.0
22+
23+
# from seclab_taskflow_agent.path_utils import mcp_data_dir
24+
from pydantic import Field
25+
from seclab_taskflow_agent.mcp_servers.codeql.client import _debug_log, run_query
2226
from sqlalchemy import create_engine
2327
from sqlalchemy.orm import Session
24-
import subprocess
25-
import importlib.resources
2628

27-
from .codeql_sqlite_models import Base, Source
2829
from ..utils import process_repo
30+
from .codeql_sqlite_models import Base, Source
2931

3032
MEMORY = Path(os.getenv('DATA_DIR', default='/app/data'))
3133
CODEQL_DBS_BASE_PATH = Path(os.getenv('CODEQL_DBS_BASE_PATH', default='/app/data'))
@@ -96,13 +98,12 @@ def store_new_source(self, repo, source_location, line, source_type, notes, upda
9698
existing.notes = (existing.notes or "") + notes
9799
session.commit()
98100
return f"Updated notes for source at {source_location}, line {line} in {repo}."
99-
else:
100-
if update:
101-
return f"No source exists at repo {repo}, location {source_location}, line {line} to update."
102-
new_source = Source(repo = repo, source_location = source_location, line = line, source_type = source_type, notes = notes)
103-
session.add(new_source)
104-
session.commit()
105-
return f"Added new source for {source_location} in {repo}."
101+
if update:
102+
return f"No source exists at repo {repo}, location {source_location}, line {line} to update."
103+
new_source = Source(repo = repo, source_location = source_location, line = line, source_type = source_type, notes = notes)
104+
session.add(new_source)
105+
session.commit()
106+
return f"Added new source for {source_location} in {repo}."
106107

107108
def get_sources(self, repo):
108109
with Session(self.engine) as session:
@@ -221,5 +222,5 @@ def clear_codeql_repo(owner: str = Field(description="The owner of the GitHub re
221222
if not os.path.isdir('/.codeql/packages/codeql/python-all'):
222223
pack_path = importlib.resources.files('seclab_taskflows.mcp_servers.codeql_python.queries').joinpath('mcp-python')
223224
print(f"Installing CodeQL pack from {pack_path}")
224-
subprocess.run(["codeql", "pack", "install", pack_path])
225+
subprocess.run(["codeql", "pack", "install", pack_path], check=False)
225226
mcp.run(show_banner=False, transport="http", host="127.0.0.1", port=9998)

src/seclab_taskflows/mcp_servers/gh_actions.py

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,24 @@
22
# SPDX-License-Identifier: MIT
33

44
import logging
5+
56
logging.basicConfig(
67
level=logging.DEBUG,
78
format='%(asctime)s - %(levelname)s - %(message)s',
89
filename='logs/mcp_gh_actions.log',
910
filemode='a'
1011
)
1112

12-
from fastmcp import FastMCP
13-
from pydantic import Field
14-
import httpx
1513
import json
1614
import os
15+
from pathlib import Path
16+
17+
import httpx
1718
import yaml
18-
from sqlalchemy.orm import DeclarativeBase, mapped_column, Mapped
19+
from fastmcp import FastMCP
20+
from pydantic import Field
1921
from sqlalchemy import create_engine
20-
from sqlalchemy.orm import Session
21-
from pathlib import Path
22+
from sqlalchemy.orm import DeclarativeBase, Mapped, Session, mapped_column
2223

2324

2425
class Base(DeclarativeBase):
@@ -218,9 +219,9 @@ async def check_workflow_reusable(
218219
for trigger in triggers:
219220
if isinstance(trigger, str) and trigger == "workflow_call":
220221
return "This workflow is reusable as a workflow call."
221-
elif isinstance(trigger, dict):
222+
if isinstance(trigger, dict):
222223
for k, v in trigger.items():
223-
if 'workflow_call' == k:
224+
if k == 'workflow_call':
224225
return "This workflow is reusable."
225226
return "This workflow is not reusable."
226227

@@ -236,19 +237,15 @@ async def get_high_privileged_workflow_triggers(
236237
results = []
237238
for trigger in triggers:
238239
if isinstance(trigger, str):
239-
if trigger in high_privileged_triggers:
240-
results.append(trigger)
241-
elif trigger == 'workflow_run':
240+
if trigger in high_privileged_triggers or trigger == 'workflow_run':
242241
results.append(trigger)
243242
elif isinstance(trigger, dict):
244243
this_results = {}
245244
for k, v in trigger.items():
246245
if k in high_privileged_triggers:
247246
this_results[k] = v
248247
elif k == 'workflow_run':
249-
if not v or isinstance(v, str):
250-
this_results[k] = v
251-
elif isinstance(v, dict) and not 'branches' in v:
248+
if not v or isinstance(v, str) or (isinstance(v, dict) and 'branches' not in v):
252249
this_results[k] = v
253250
if this_results:
254251
results.append(this_results)
@@ -293,7 +290,7 @@ async def get_workflow_user(
293290
if action_name in use:
294291
actual_name[use] = []
295292
for i, line in enumerate(lines):
296-
for use in actual_name.keys():
293+
for use in actual_name:
297294
if use in line:
298295
actual_name[use].append(i + 1)
299296
for use, line_numbers in actual_name.items():
@@ -316,7 +313,7 @@ async def get_workflow_user(
316313
workflow_use = WorkflowUses(**result)
317314
session.add(workflow_use)
318315
session.commit()
319-
return f"Search results saved to database."
316+
return "Search results saved to database."
320317
return json.dumps(results)
321318

322319
@mcp.tool()

src/seclab_taskflows/mcp_servers/gh_code_scanning.py

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,26 +2,28 @@
22
# SPDX-License-Identifier: MIT
33

44
import logging
5+
56
logging.basicConfig(
67
level=logging.DEBUG,
78
format='%(asctime)s - %(levelname)s - %(message)s',
89
filename='logs/mcp_gh_code_scanning.log',
910
filemode='a'
1011
)
11-
from fastmcp import FastMCP
12-
from pydantic import Field
13-
import httpx
14-
import aiofiles
1512
import json
1613
import os
1714
import re
18-
from urllib.parse import urlparse, parse_qs
19-
from pathlib import Path
2015
import zipfile
16+
from pathlib import Path
17+
from urllib.parse import parse_qs, urlparse
18+
19+
import aiofiles
20+
import httpx
21+
from fastmcp import FastMCP
22+
from pydantic import Field
2123
from sqlalchemy import create_engine
2224
from sqlalchemy.orm import Session
2325

24-
from .alert_results_models import AlertResults, AlertFlowGraph, Base
26+
from .alert_results_models import AlertFlowGraph, AlertResults, Base
2527

2628
mcp = FastMCP("GitHubCodeScanning")
2729

@@ -158,7 +160,7 @@ async def fetch_alerts_to_sql(
158160
) -> str:
159161
"""Fetch all code scanning alerts for a specific repository and store them in a SQL database."""
160162
results = await fetch_alerts_from_gh(owner, repo, state, rule)
161-
sql_db_path = f"sqlite:///{ALERT_RESULTS_DIR}/alert_results.db"
163+
sql_db_path = f"sqlite:///{ALERT_RESULTS_DIR}/alert_results.db"
162164
if isinstance(results, str) or not results:
163165
return results
164166
engine = create_engine(sql_db_path, echo=False)

src/seclab_taskflows/mcp_servers/gh_file_viewer.py

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,26 +2,27 @@
22
# SPDX-License-Identifier: MIT
33

44
import logging
5+
56
logging.basicConfig(
67
level=logging.DEBUG,
78
format='%(asctime)s - %(levelname)s - %(message)s',
89
filename='logs/mcp_gh_file_viewer.log',
910
filemode='a'
1011
)
1112

12-
from fastmcp import FastMCP
13-
from pydantic import Field
14-
import httpx
1513
import json
1614
import os
17-
from sqlalchemy.orm import DeclarativeBase, mapped_column, Mapped
18-
from sqlalchemy import create_engine
19-
from sqlalchemy.orm import Session
20-
from typing import Optional
15+
import tempfile
16+
import zipfile
2117
from pathlib import Path
18+
2219
import aiofiles
23-
import zipfile
24-
import tempfile
20+
import httpx
21+
from fastmcp import FastMCP
22+
from pydantic import Field
23+
from sqlalchemy import create_engine
24+
from sqlalchemy.orm import DeclarativeBase, Mapped, Session, mapped_column
25+
2526

2627
class Base(DeclarativeBase):
2728
pass
@@ -112,7 +113,7 @@ def search_zipfile(database_path, term):
112113
for i, line in enumerate(f):
113114
if term in str(line):
114115
filename = remove_root_dir(entry.filename)
115-
if not filename in results:
116+
if filename not in results:
116117
results[filename] = [i+1]
117118
else:
118119
results[filename].append(i+1)
@@ -154,8 +155,7 @@ async def get_file_lines_from_gh(
154155
if isinstance(r, str):
155156
return r
156157
lines = r.text.splitlines()
157-
if start_line < 1:
158-
start_line = 1
158+
start_line = max(start_line, 1)
159159
if length < 1:
160160
length = 10
161161
lines = lines[start_line-1:start_line-1+length]
@@ -217,7 +217,7 @@ async def search_files_from_gh(
217217
search_result = SearchResults(**result)
218218
session.add(search_result)
219219
session.commit()
220-
return f"Search results saved to database."
220+
return "Search results saved to database."
221221
return json.dumps(results)
222222

223223
@mcp.tool()

src/seclab_taskflows/mcp_servers/ghsa.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,19 @@
11
import logging
2+
23
logging.basicConfig(
34
level=logging.DEBUG,
45
format='%(asctime)s - %(levelname)s - %(message)s',
56
filename='logs/mcp_ghsa.log',
67
filemode='a'
78
)
89

10+
import json
11+
import re
12+
from urllib.parse import parse_qs, urlparse
13+
914
from fastmcp import FastMCP
1015
from pydantic import Field
11-
import re
12-
import json
13-
from urllib.parse import urlparse, parse_qs
16+
1417
from .gh_code_scanning import call_api
1518

1619
mcp = FastMCP("GitHubRepoAdvisories")

src/seclab_taskflows/mcp_servers/local_file_viewer.py

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,21 @@
22
# SPDX-License-Identifier: MIT
33

44
import logging
5+
56
logging.basicConfig(
67
level=logging.DEBUG,
78
format='%(asctime)s - %(levelname)s - %(message)s',
89
filename='logs/mcp_local_file_viewer.log',
910
filemode='a'
1011
)
1112

12-
from fastmcp import FastMCP
13-
from pydantic import Field
14-
import httpx
1513
import json
1614
import os
17-
from pathlib import Path
18-
import aiofiles
1915
import zipfile
20-
import tempfile
16+
from pathlib import Path
2117

18+
from fastmcp import FastMCP
19+
from pydantic import Field
2220

2321
mcp = FastMCP("LocalFileViewer")
2422

@@ -61,7 +59,7 @@ def search_zipfile(database_path, term, search_dir = None):
6159
for i, line in enumerate(f):
6260
if term in str(line):
6361
filename = remove_root_dir(entry.filename)
64-
if not filename in results:
62+
if filename not in results:
6563
results[filename] = [i+1]
6664
else:
6765
results[filename].append(i+1)
@@ -126,8 +124,7 @@ async def get_file_lines(
126124
if not source_path or not source_path.exists():
127125
return f"Invalid {owner} and {repo}. Check that the input is correct or try to fetch the repo from gh first."
128126
lines = get_file(source_path, path)
129-
if start_line < 1:
130-
start_line = 1
127+
start_line = max(start_line, 1)
131128
if length < 1:
132129
length = 10
133130
lines = lines[start_line-1:start_line-1+length]

src/seclab_taskflows/mcp_servers/local_gh_resources.py

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,21 @@
22
# SPDX-License-Identifier: MIT
33

44
import logging
5+
56
logging.basicConfig(
67
level=logging.DEBUG,
78
format='%(asctime)s - %(levelname)s - %(message)s',
89
filename='logs/mcp_local_gh_resources.log',
910
filemode='a'
1011
)
1112

12-
from fastmcp import FastMCP
13-
from pydantic import Field
14-
import httpx
1513
import json
1614
import os
1715
from pathlib import Path
18-
import aiofiles
19-
import zipfile
20-
import tempfile
2116

17+
import aiofiles
18+
import httpx
19+
from fastmcp import FastMCP
2220

2321
mcp = FastMCP("LocalGHResources")
2422

0 commit comments

Comments
 (0)